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.