>> SPEAKER: Līdz šim, tas ir iespējams, ka lielākā daļa no jūsu programmas
ir mazliet īslaicīgi.
Jūs palaist programmu, piemēram, Mario vai mantkārīgs.
Tas kaut ko dara, tas varbūt liek lietotājs kādu informāciju,
drukāt kādu izejas uz ekrāna, bet tad, kad jūsu programma ir beigusies,
tur tiešām nav pierādījumu, ka tas bija kādreiz palaist pirmajā vietā.
Es domāju, protams, jūs varētu būt atstājuši tā atvērta termināļa logā,
bet, ja jūs skaidri jūsu ekrāna, tur ir tiešām nav pierādījumu, ka tā pastāvējusi.
Mums nav iespēju uzglabāt noturīgas informācija, ziņas
ka pastāv pēc mūsu Programma ir pārtraucis darboties,
vai mums nav līdz šim punktam.
Par laimi, lai gan, c dara pastāstiet mums spēju
to darīt, īstenojot kaut ko sauc
fails, struktūru, kas būtībā apzīmē failu, jūs varētu divkāršot
noklikšķiniet uz jūsu datora, ja jūs esat izmanto, lai grafisko lietotāja vidi.
Parasti, strādājot ar c, mēs esam patiesībā
būs, kas strādā ar norādes uz files-- failu stars--
izņemot mazliet kad mēs runājam par pāris
no funkcijām, kas strādāt ar failu norādes.
Jums nav nepieciešams, lai būtu patiesi zemnīca pārāk dziļi izpratne norādes
paši.
Tur ir maz maziņš mazliet kur mēs runājam par tiem,
bet parasti failu norādes un norādes, bet savstarpēji saistīti,
nav tieši tas pats.
>> Tagad to, ko es domāju, kad Es saku noturīgus datus?
Kas ir noturīgas dati?
Kāpēc mēs rūpējamies par to?
Teikt, piemēram, ka jūs darbojas programma
vai jūs esat pārrakstīt programmu, kas ir spēle,
un jūs vēlaties, lai izsekotu no visa lietotāja kustas
tā ka varbūt, ja kaut kas noiet greizi, Jūs varat pārskatīt failu pēc spēles.
Tas, ko mēs domājam, kad mēs runāt par noturīgiem datiem.
>> Gaitā rādīt programma, fails ir izveidots.
Un, ja jūsu programma ir pārtraucis darboties,
ka fails joprojām pastāv jūsu sistēmā.
Un mēs varam apskatīt to un izvērtēt to.
Un tā, ka programma tiks iestatīts ir radījuši dažus pastāvīgus datus,
dati ir pēc programmas ir beidzis darboties.
>> Tagad visas šīs funkcijas, kas strādā ar radot failus un manipulējot
viņiem dažādos veidos dzīvo standarta io.h,
kas ir header fails, Jūs esat iespējams bijis mārciņa
ieskaitot augšpusē diezgan daudz visas programmas
jo tā satur vienu no visvairāk noderīgas funkcijas par mums,
printf, kas arī ļauj dzīvo standarta io.h.
Tātad jums nav nepieciešams, lai mārciņa iekļaut papildu failus iespējams
Lai strādātu ar failu norādes.
>> Tagad katru failu rādītājs funkcija, vai katru failu I / O, ieejas izejas
funkcija, pieņem kā vienu tās parametriem vai ieejas
fails pointer-- izņemot par vienu, fopen, kas
ir tas, ko jūs izmantojat, lai saņemtu failu rādītāju pirmajā vietā.
Bet pēc tam, kad esat atvērts failu un jūs saņemsiet failu norādes,
tad jūs varat nodot tos kā argumenti par dažādām funkcijām
mēs runāsim par šodien, kā arī daudzi citi
lai jūs varētu strādāt ar failiem.
>> Tātad ir seši diezgan kopēji pamata Ones
ka mēs ejam runāt par šodien.
fopen un tās biedrs funkcija fclose, fgetc
un tās biedrs funkcija fputc, un fread un tās biedrs funkcija,
fwrite.
Tātad, pieņemsim iegūt tiesības uz to.
>> fopen-- ko tas dara?
Nu, tas atver failu un tas dod jums faila rādītāju uz to,
lai jūs varētu izmantot tad, ka failu rādītāju kā argumentu
ar jebkuru no otras failu I / O funkciju.
Vissvarīgākais atcerēties ar fopen
ir tas, ka pēc tam, kad esat atvēris failu vai zvanīju kā viens šeit,
jums nepieciešams pārbaudīt, lai pārliecinātos, ka rādītājs, ka jums atpakaļ
nav vienāds ar null.
Ja neesat noskatījos video norādes, tas, iespējams, nav jēgas.
Bet, ja jūs mēģināt un dereference Null rādītājs atgādināt,
Jūsu programma, iespējams, cietīs segmentācija [nedzirdama].
Mēs vēlamies, lai pārliecinātos, ka mēs ieguva likumīgu rādītāju atpakaļ.
Lielākā daļa laika mēs gotten likumīgas rādītāju atpakaļ
un tā nebūs problēma.
>> Tātad, kā mēs Piezvaniet fopen?
Tas izskatās diezgan daudz, piemēram, šis.
File zvaigzne ptr-- PTR ir vispārējs nosaukt failu pointer-- fopen
un mums iet ar divām lietām, faila nosaukumu un darbība mēs vēlamies uzņemties.
Tātad mēs varētu būt zvanu, kas izskatās kā this-- failu star PTR 1 vienāds fopen
file1.txt.
Un operācija es esmu izvēlējies, ir r.
>> Tātad, ko jūs domājat r ir šeit?
Kādas ir lietas veidu mēs varētu darīt, lai failus?
Tātad r ir darbība, ka mēs izvēlēties, kad mēs gribam, lai izlasītu failu.
Tātad mēs būtu būtībā kad mēs veiktu zvanu, piemēram, tas
iegūt sev faila rādītāju tāda, ka mēs pēc tam varētu nolasīt informāciju
no file1.txt.
>> Tāpat mēs varētu atvērt failu 2.txt rakstīšanai un lai mēs varētu pāriet ptr2,
fails rādītājs Esmu izveidojis šeit, kā arguments, lai jebkuru funkciju, kas
raksta informāciju failā.
Un līdzīgi rakstiski, tur ir arī iespēja pievienot, a.
Atšķirība starp rakstiski un pievienojot
ir tas, ka tad, kad jūs rakstīt uz failu, ja jūs veicat zvanu fopen rakstīšanai
un ka fails jau pastāv, tā ir gatavojas pārrakstīt visu failu.
Tas notiek, lai sāktu pašā sākumā,
izdzēšot visu informāciju tas jau tur.
>> Tā kā, ja atverat to pievienojot, tā iet uz beigām failu
ja tur ir jau teksts tā vai tajā esošā informācija,
un tas būs pēc tam sākt rakstiski no turienes.
Tātad jums nav zaudēt kādu no informācija, ko jūs esat darījuši līdz šim.
Vai vēlaties, lai rakstītu vai pievienot veida ir atkarīgs no situācijas.
Bet jūs droši vien zināt, ko Tiesības operācija ir tad, kad pienāks laiks.
Tātad tas ir fopen.
>> Kas par fclose?
Nu, diezgan vienkārši, fclose vienkārši akceptē faila rādītāju.
Un, kā jūs varētu gaidīt, tas aizveras šo failu.
Un, kad mēs esam slēgti failu, mēs nevaram veikt kādu lielāku failu I / O funkcijas,
lasot vai rakstot, uz šo failu.
Mums ir jauna atvērt failu citā laikā, lai
turpināt darbu ar tā, izmantojot I / O funkcijas.
Tātad fclose nozīmē, ka mēs esam darījuši Strādājot ar šo failu.
Un viss, kas mums ir nepieciešams, lai caurlaide ir nosaukums, faila rādītāju.
Tātad uz pāris slīd atpakaļ, mēs fopened fails 1 dot teksta lasīšanai
un mēs piešķirts ka faila rādītāju ptr1.
Tagad mēs esam nolēmuši, mēs esam darīts lasījums no šī faila.
Mums nav nepieciešams darīt vairāk ar to.
Mēs varam tikai fclose ptr1.
Un līdzīgi, varētu mums fclose citiem uzņēmumiem.
Viss kārtībā.
Tātad, kas ir atvēršanas un aizvēršanas.
Tie ir divi galvenie sākot darbību.
>> Tagad mēs vēlamies, lai reāli darīt kādu interesantu,
un pirmais uzdevums, ka mēs redzēt, ka būs jādara tas fgetc--
fails iegūt raksturs.
Tas, ko fgetc vispār nozīmētu.
Tās mērķis dzīvē ir lasīt nākamo rakstzīmi,
vai, ja tas ir jūsu ļoti Pirmais zvans uz fgetc
par konkrētu failu, pirmais raksturs.
Bet tad pēc tam, Jums nākamo,
jau nākamajā raksturu šo failu, un to noglabā rakstzīmju mainīgā.
Kā mēs esam darījuši šeit, char ch vienāds fgetc,
pāriet uz faila nosaukumu rādītājs.
Atkal, tas ir ļoti svarīgi šeit atcerēties
ka, lai tām būtu Šī operācija izdosies,
fails rādītājs pati must've atvērts lasīšanai.
Mēs nevaram nolasīt rakstzīmi no faila rādītājs, ka mēs atvērām rakstīšanai.
Tātad tas ir viens no ierobežojumi fopen, vai ne?
Mums ir ierobežot sevi tikai veicot
viena operācija ar vienu faila rādītāju.
Ja mēs vēlējāmies, lai lasītu un rakstīt no tā paša faila
mēs būtu atvērti divi atsevišķi failu norādes uz to pašu file--
viens par lasīšanu, viens rakstīšanai.
>> Tātad vēlreiz, vienīgais iemesls Nesu, ka līdz šim ir
jo, ja mēs ejam, lai veiktu zvanu lai fgetc, ka fails rādītājs must've
atvērts lasīšanai.
Un tad diezgan vienkārši, viss, kas mums jādara,
ir caurlaide nosaukumu faila rādītāju.
Tātad char ch vienāds fgetc ptr1.
>> Tas notiek, lai saņemtu mums nākamais character--
vai atkal, ja tas ir pirmais reize, kad mēs esam padarījuši šo aicinājumu,
pirmais character-- no kāda fails tiek norādīts ar ptr1.
Atgādināt, ka tas bija fails 1 dot teksts.
Tas būs iegūt pirmo raksturu, kas un mēs uzglabāt to mainīgo ch.
Diezgan vienkārši.
Tātad, mēs esam tikai paskatījās trīs funkcijas un jau mēs
var darīt kaut ko diezgan veikls.
>> Tātad, ja mēs šo spēju iegūt raksturs
un mēs cilpa it-- lai mēs turpina saņemt rakstzīmes
no faila vairāk un vairāk un over-- tagad mēs
var lasīt katru raksturs failā.
Un, ja mēs drukāt katru raksturu tūlīt pēc tam, kad mēs lasām to,
tagad mēs esam lasīt no faila un drukāts tās saturu uz ekrāna.
Mēs esam efektīvi saliktās ka fails uz ekrāna.
Un tas ir tas, ko Linux komandu kaķis dara.
>> Ja jūs veida kaķi faila nosaukumu, to izdrukās visu saturu
no failu jūsu termināla logā.
Un tā tas maz cilpa šeit, tikai trīs rindas kods,
bet tas faktiski dublē Linux komandu kaķis.
Tātad šis sintakse varētu izskatās mazliet dīvaini,
bet šeit ir to, kas notiek šeit.
Kaut ch vienāds fgetc, PTR nav vienāds ar EOF-- tas viss kumoss,
bet pieņemsim sadalīs to vienkārši tāpēc tas ir skaidrs, uz sintaksi.
Esmu konsolidēti to labad telpu,
lai gan tas ir nedaudz sintaktiski grūts.
>> Tātad šī daļa zaļā tiesībām Tagad, kas ir tā dara?
Nu, tas ir tikai mūsu fgetc zvanu, vai ne?
Mēs esam redzējuši, ka pirms.
Tas ir iegūt vienu raksturs no lietas materiāliem.
Tad mēs salīdzinām, ka raksturs pret EOF.
EOF ir īpaša vērtība, kas ir noteikts standarta io.h, kas
ir beigas failu raksturs.
Tātad būtībā, kas notiek varētu notikt ir šī cilpa lasīs raksturs,
salīdzināt to ar EOF, tad faila beigas raksturs.
Ja tie nesakrīt, tāpēc mums nav sasnieguši faila,
mēs izdrukāt ka raksturu out.
Tad mēs iesim atpakaļ uz sākot no cilpas vēlreiz.
Mēs saņemsiet raksturs, pārbaudiet pret EOF, izdrukāt to ārā, un tā tālāk
un tā tālāk, un tā tālāk, looping caur tādā veidā
kamēr mēs esam sasnieguši faila.
Un tad ar šo punktu, mēs esam iespiesti
ārā visu saturu faila.
Tātad vēlreiz, mēs esam tikai redzējis fopen, fclose, un fgetc
un jau mēs varam dublēt Linux termināls komandu.
>> Kā jau teicu sākumā, mums bija fgetc un fputc,
un fputc bija biedrs funkcija fgetc.
Un tā, kā jūs varētu iedomāties, tas ir rakstiski ekvivalents.
Tas ļauj mums rakstīt vienu rakstzīmi uz failu.
>> Atkal, brīdinājumu ir, tikai tāpat kā tas bija ar fgetc, fails
ka mēs esam rakstiski must've bijis atvērts rakstīšanai vai pievienojot.
Ja mēs mēģinātu izmantot fputc uz failu ka mēs esam atvērti lasīšanai,
mēs ejam ciest mazliet kļūda.
Bet zvans ir diezgan vienkāršs.
fputc kapitāls ptr2, visi kas gatavojas darīt, ir tā
gatavojas rakstīt vēstuli, stājas spēkā failā 2 dot
teksts, kurā bija vārds no failu, ka mēs atvērām un piešķir
rādītāja ptr2.
Tāpēc mēs esam gatavojas rakstīt kapitāls A līdz failu 2 dot tekstu.
Un mēs uzrakstīt izsaukuma norāda uz failu 3 dot
teksts, kas tika norādīts uz ko ptr3.
Tātad vēlreiz, diezgan vienkāršs šeit.
>> Bet tagad mēs varam darīt citas lietas.
Mums ir šo piemēru mēs vienkārši iet pa
par to var atkārtot kaķi Linux komandu, vienu, kas izdrukā
uz ekrāna.
Nu, tagad, kad mums ir iespēja lasīt rakstzīmes no failiem
un rakstīt rakstzīmes failiem, kāpēc nav mēs vienkārši aizstāt, ka
zvanīt uz printf ar aicinājumu fputc.
>> Un tagad mēs esam dublēta KP, ļoti vienkāršas Linux komandu
ka mēs runājām par ceļu garš Pirms Linux komandas video.
Mēs esam efektīvi pavairot, ka tieši šeit.
Mēs lasāt raksturs, un tad mēs esam rakstot šo raksturu uz citu failu.
Lasījums no viena faila, rakstot uz otru, vairāk un vairāk
un atkal, kamēr mēs hit EOF.
Mēs esam ieguvuši, lai beigām failu mēs cenšamies kopēt no.
Un līdz ar to mēs esam uzrakstījuši visi rakstzīmes mums lietai
ka mēs esam rakstiski.
Tātad šis ir cp, Linux kopija komandu.
>> Pašā sākumā Šis video, man bija brīdinājumu
ka mēs varētu runāt Mazliet par norādes.
Te ir īpaši, ja mēs esam gatavojas runāt par norādes
papildus iesniegt norādes.
Tātad šī funkcija izskatās veida biedējošu.
Tas ir ieguvuši vairākus parametrus.
Tur ir daudz kas notiek šeit.
Tur ir daudz dažādi krāsas un teksti.
Bet tiešām, tas ir tikai vispārējs versija fgetc
kas ļauj mums, lai saņemtu kādu informācijas apjomu.
Tas var būt mazliet neefektīvs, ja mēs esam kļūst rakstzīmes pa vienam,
atkārtojot caur failu viens raksturs laikā.
Vai tas būtu jaukāk, lai saņemtu 100 laikā, vai 500 vienlaicīgi?
>> Nu, fread un tās biedrs funkcija fwrite, kuru mēs runājam par
Kā otru, ļauj mums darīt tieši to.
Mēs varam lasīt patvaļīgu summu informāciju no faila
un mēs uzglabāt to kaut kur īslaicīgi.
Tā vietā, lai to var vienkārši fit to vienu mainīgo,
mums var būt nepieciešams, lai saglabātu to masīvā.
Un tā, mēs caurlaide četrās argumenti fread-- rādītāju
uz vietu, kur mēs esi gatavojas, lai saglabātu informāciju,
cik liela katra informācijas vienība būs, cik daudz vienību informācijas
mēs vēlamies iegūt, un no kurš fails mēs gribam, lai saņemtu viņiem.
Iespējams, vislabāk ilustrē ar piemēru šeit.
Tātad pieņemsim, ka mēs paziņojam masīvs 10 veseli skaitļi.
Mēs esam tikko paziņoja, par kaudze patvaļīgi int arr 10.
Tā ka ir diezgan vienkārši.
Tagad to, ko mēs darām, lai gan ir frecall ir mēs lasāt lielumu int
reizes 10 baiti informācijas.
Izmērs int būtnes four-- tas izmērs no vesela skaitļa in c.
>> Tātad, ko mēs darām, ir mums lasāt 40 baiti vērts informācijas
no lietas materiāliem norādīja uz ko PTR.
Un mēs esam tie, uzglabājot 40 baiti kaut kur
kur mēs esam atcelt 40 baiti vērts atmiņas.
Par laimi, mēs esam jau darījuši līdz paziņojot arr, ka masīvs tiesības tur.
Tas spēj saimniecības 10 četru baitu vienības.
Tātad kopumā, tas var būt 40 baiti vērts informācijas.
Un tagad mēs esam lasījums 40 baiti informāciju no lietas materiāliem,
un mēs esam uzglabājot to ARR.
>> Atsaukt no video uz norādes, ka nosaukumu masīva, piemēram, ARR,
patiešām ir tikai rādītājs uz tās pirmais elements.
Tātad, kad mēs pāriet ARR tur, mēs ir, faktiski, kas iet rādītājs.
>> Tāpat mēs varam darīt this-- mēs ne vienmēr
nepieciešams, lai saglabātu mūsu buferis uz skursteņa.
Mēs varētu arī dinamiski piešķirt buferis, piemēram, tas, izmantojot malloc.
Atcerieties, kad mēs dinamiski piešķirt atmiņu,
mēs saglabājot to uz kaudze, nevis kaudze.
Bet tas joprojām ir buferis.
>> Tā vēl, šajā gadījumā, ir turot 640 baitu informācijas
jo dubultā aizņem astoņas baiti.
Un mēs esam lūdzot 80 no tiem.
Mēs vēlamies, lai būtu telpa turēt 80 dubultspēlē.
Tātad 80 reizes 8 ir 640 baiti informācija.
Un tas aicinājums fread ir savācot 640 baitu informācijas
No lietas materiāliem norādīja uz ko PTR un uzglabājot to tagad arr2.
>> Tagad mēs varam arī ārstēt fread tāpat kā aicinājumu uz fgetc.
Šajā gadījumā, mēs esam tikai cenšas saņemt vienu rakstzīmi no lietas materiāliem.
Un mums nav vajadzīga masīvs rīkot raksturs.
Mēs varam tikai uzglabāt to raksturs mainīgs.
>> Nozvejas, lai gan, ir tas, ka kad mums vienkārši ir mainīgs,
mums ir nepieciešams braukt, tādā adrese šī mainīgā
jo atgādināt, ka Pirmais arguments fread
ir pointers uz atrašanās vietu un atmiņas kur mēs vēlamies saglabāt šo informāciju.
Atkal, nosaukumu, masīvs ir rādītājs.
Tātad mums nav jādara aizvieto & zīmes masīvs.
Bet c, raksturs c šeit, nav masīvs.
Tas ir tikai mainīga.
Un tāpēc mums ir nepieciešams nokārtot Ampersand c norādīt
ka tas ir adrese, kur mēs gribam saglabāt šo vienu baitu informācijas,
tas viens raksturu, kas mēs apkopojam no PTR.
Fwrite-- Es iešu cauri Tas mazliet vairāk
quickly-- ir diezgan daudz precīzs ekvivalents fread
izņemot tā rakstīšanai nevis lasījumā, tikai
tāpat kā other-- mēs esam bija atvērti un aizvērt, iegūt raksturs,
rakstīt raksturs.
Tagad tas ir iegūt patvaļīgs informācijas apjoms,
tiesības patvaļīgi informācijas apjomu.
Tātad, tāpat kā līdz šim, mēs varam ir masīvs 10 veseli skaitļi
kur mums jau ir uzglabāto informāciju, varbūt.
>> Tas bija iespējams, dažas rindiņas kodu ka vajadzētu iet starp šiem diviem
kur es aizpildīt arr ar kaut kas nozīmīgs.
Es piepilda to ar 10 dažādiem veseliem skaitļiem.
Un tā vietā, ko es esmu darot raksta no ARR
un vācot informāciju no ARR.
Un es esmu ņemot šo informāciju un liekot to failā.
>> Tā vietā, tas ir, no failu uz bufera,
Mēs tagad iet no bufera uz failu.
Tātad, tas ir tikai otrādi.
Tātad atkal, tāpat kā iepriekš, mēs varam ir arī kaudze rieciens atmiņas
ka mēs esam dinamiski piešķirti un lasīt no
un rakstīt, ka uz failu.
>> Un mums ir arī viens mainīgais spēj noturēt vienu baitu
informācijas, piemēram, raksturs.
Bet atkal, mums ir caurlaide adrese šī mainīgā
ja mēs gribam, lai lasītu no tā.
Tātad, mēs varam rakstīt informāciju mēs atrast šajā adresē
uz failu rādītājs, PTR.
>> Tur ir daudz citu liels failu I / O funkcijas
ka darīt dažādas lietas, turklāt tie, mēs esam runājuši par šodienu.
Pāris no tiem jūs varētu atrast noderīgu
ir fgets un fputs, kas ir ekvivalents
no fgetc un fputc bet lasīšanai viens string no faila.
Tā vietā, lai vienu raksturs, tas būs lasīt visu virkni.
fprintf, kas būtībā ļauj jums izmantot printf rakstīt failā.
Tātad tāpat kā jūs varat darīt mainīgo aizvietošana, izmantojot
vietturi procenti i un procenti d, un tā tālāk, ar printf
Jūs varat līdzīgi ņemiet līdzi printf stīgu un drukāt kaut
piemēram, ka uz failu.
>> fseek-- ja jums ir DVD atskaņotājs ir analoģija es parasti lietoju here--
ir veida, piemēram, izmantojot savu attīt atpakaļ un ātri uz priekšu
pogas, lai pārvietotos pa filmu.
Līdzīgi, jūs varat pārvietoties pa failu.
Viena no lietām, iekšpusē ka faila struktūra
ka c rada jums ir indikators no tā, kur jūs esat failā.
Vai jūs pie ļoti sākas pēc baits nulles?
Vai jūs pie baitu 100, baitu 1000, un tā tālāk?
Jūs varat izmantot fseek patvaļīgi pārvietot ka indikators uz priekšu vai atpakaļ.
>> Un ftell, atkal līdzīgi DVD atskaņotāju,
ir kā mazs pulksteni, kas stāsta Jums, cik minūtes un sekundes jums
Ir uz īpašu filmu.
Tāpat ftell stāsta, kā daudzi baiti esat failā.
feof ir atšķirīga versija konstatēt, vai jūs esat
sasnieguši failu.
Un ferror ir funkcija ka jūs varat izmantot
lai noteiktu, vai kaut kas ir nogājis greizi Darbs ar failu.
Atkal, tas ir tikai nesaskrāpē virsmu.
Tur ir vēl daudz vairāk failu I / O funkcijas standarta io.h.
Bet tas būs iespējams iegūt jums sāka strādāt ar failu norādes.
Es esmu Doug Lloyd.
Tas ir CS50.