SPEAKER: Do sedaj, je verjetno, da je večina vaših programov so bili malo kratkotrajen. Zaženete program, kot Mario ali požrešen. To počne nekaj, kar je morda pozove uporabnik nekaj informacij, natisniti nekaj izhod na zaslonu, potem pa, ko je vaš program je več, pa je res ni dokazov, da je bilo vedno deluje v prvi vrsti. Mislim, seveda, lahko so zapustili odpreti v terminalskem oknu ampak če počistite zaslon, tam je res ni dokazov, da je obstajala. Nimamo kot sredstvo za shranjevanje obstojne informacije, informacije da obstaja po najinem Program je ustavil teče, ali imamo ne do te točke. Na srečo, čeprav, c pa Posredujte nam s sposobnostjo da to storijo z izvajanjem nekaj, kar se imenuje datoteka, struktura, ki v bistvu pomeni datoteko, ki bi jo podvojilo kliknite na računalniku, če ste uporablja za grafični uporabniški okolje. Na splošno pri delu s C, smo dejansko bo treba delati z kazalci za files-- datoteko stars-- razen za malo ko govorimo o paru funkcij, ki delo z datotek kazalci. Vam ni treba, da so res izkopali pregloboko v razumevanje kazalcev sami. Tam je malo poskočno bit kjer bomo govorili o njih, ampak na splošno datoteko napotke in kazalci, medtem ko so med seboj povezani, niso natanko ista stvar. Zdaj kaj mislim, ko Pravim trajnih podatkov? Kaj je obstojna podatki? Zakaj nas skrbi glede tega? Reči, na primer, da tečete program ali ste prepisovati Program, ki je igra, in želite slediti vseh uporabnikovih potez tako da morda, če gre kaj narobe, si lahko ogledate datoteko po tekmi. To je tisto, kar mislimo, ko govorimo o obstojnih podatkov. V teku teče vaš Program se ustvari datoteko. In ko je vaš program je ustavil teče, da je datoteka še vedno obstaja na vašem sistemu. In bomo lahko ogledate na njem in ga preuči. In tako da bi program nastavljen na so ustvarili nekaj trajnih podatkov, obstajajo podatki po programu je končal tekmovanje v teku. Zdaj vse te funkcije, ki delajo z ustvarjanjem datotek in manipulacijo jim na različne načine živijo v standardni io.h, ki je datoteka glava, ki ki ste jih verjetno že pound vključno na vrhu precej veliko vse svoje programe ker vsebuje eno izmed večina uporabnih funkcij za nas, printf, ki prav tako omogoča živi v standardnem io.h. Torej vam ni treba, da melje vključujejo morebitne dodatne datoteke verjetno da bi delo z datotek kazalci. Zdaj vsak funkcija datoteka kazalec, ali posamezna datoteka I / O, input output Funkcija, sprejema kot enega njegovih parametrov ali vložki datoteka pointer-- razen za eno, fopen, ki je tisto, kar boste uporabili, da bi dobili datoteko kazalec na prvem mestu. Toda, ko ste jih odprli datoteko in dobili boste datoteko kazalce, lahko nato mimo njih, kot je argumenti različnih funkcij bomo govorili o danes, kot tudi mnoge druge tako da lahko delate z datotekami. Torej, obstaja šest precej skupna osnovna tisti da bomo danes govorili. fopen in njen spremljevalec Funkcija fclose, fgetc in njegova funkcija spremljevalec fputc, in fread in njen spremljevalec funkcijo, fwrite. Torej, kaj je dobil naravnost vanjo. fopen-- kaj počne? No, to odpre datoteko in jo vam datotečni kazalec na njej, tako da lahko nato uporabite, da datoteke kazalec kot argument katerokoli drugo datoteko I / O funkcije. Najbolj pomembna stvar da se spomnimo z fopen je, da po tem, ko ste odprli vložiti ali je klic, kot tistega, tukaj, morate preverite, da je kazalec, da si dobil nazaj ni enaka nič. Če še niste gledal video na kazalci, to ne bi bilo smiselno. Ampak, če ste poskušali in dereference null kazalec odpoklic, vaš program bo najverjetneje trpel segmentacijo [neslišno]. Želimo zagotoviti, da bomo dobil legitimno kazalec nazaj. Velika bomo večino časa gotten legitimno kazalec nazaj in da ne bo problem. Torej, kako narediti klic fopen? Videti je precej všeč. Datoteka zvezda ptr-- PTR pa generično ime za datoteko pointer-- fopen in se peljemo v dveh stvareh, ime datoteke in operacija želimo opraviti. Torej, morda imamo klic, ki izgleda kot this-- datoteka zvezda ptr 1 enaka fopen file1.txt. In operacija sem izbral, je r. Torej, kaj misliš, da je r tu? Katere so vrste stvari, ki smo bi mogli storiti, da bi datoteke? Torej r je operacija, ki smo izbrati, če želimo, da se glasi datoteke. Torej bi mi v bistvu, ko smo klic, kot je ta se sami dobili datotečni kazalec tako, da smo lahko nato bere informacijo od file1.txt. Podobno bi lahko odprete datoteke 2.txt za pisanje in da bomo lahko mimo ptr2, kazalec datoteka sem tu ustvaril, kot argument koli funkcije, ki piše podatke v datoteko. In podobno kot pisanje, tam je tudi možnost, da pripnemo, a. Razlika med pisanje in slepič je, da ko pišete na datoteko, če kličete na fopen za pisanje in da datoteka že obstaja, je gre prepisati celoten spis. To se dogaja, da začnete na samem začetku, brisanje vseh podatkov da je že tam. Ker če jo odprete za slepič, da bo šla do konca spisa če je že tekst v to, ali podatki v njej, in da bo nato začela pisati od tam. Tako ne boste izgubili koli od Podatki, ki ste jih naredili prej. Ali želite pisati ali dodajte nekako odvisno od razmer. Vendar boste verjetno veste, kaj je Pravica delovanje je, ko pride čas. Tako da je fopen. Kaj fclose? No, zelo preprosto, fclose samo sprejema datoteke kazalec. In kot bi lahko pričakovali, zapre datoteko. In ko smo zaprli datoteko, ne moremo opravlja vse večjo datoteko I / O funkcije, branje ali pisanje, na tej datoteki. Moramo ponovno odpreti vložiti še čas, da bi še naprej sodelovati z je z uporabo I / O funkcije. Torej fclose sredstva bomo storili ki delajo s to datoteko. In vse, kar potrebujemo, da prenese v je ime datoteke kazalca. Torej na par drsi nazaj, smo fopened datotek 1 pika besedilo za branje in mi dodeli, da datoteke kazalec na ptr1. Zdaj smo se odločili, da smo storiti branju iz te datoteke. Nam ni treba storiti nič več z njo. Mi lahko samo fclose ptr1. In podobno, lahko smo fclose druge narave. V redu. Tako da je odpiranje in zapiranje. To sta dva osnovna zagonom. Sedaj želimo dejansko naredite nekaj zanimivih stvari, in prva naloga, da bomo glej, da bo naredil, da je fgetc-- vložiti dobili značaj. To je tisto, kar fgetc splošno bi pomenilo. Njen cilj v življenju je, da preberite naslednji znak, ali, če je to vaš zelo Prvi klic na fgetc za določeno datoteko, je prvi znak. Potem pa po tem, boste dobili naslednjo, že naslednji značaj te datoteke, in ga shrani v spremenljivko znakov. Kot smo tukaj naredili, char ch enaka fgetc, preide v imenu datoteke kazalca. Še enkrat, to je zelo pomembno, da se spomnimo da bi imeli ta operacija uspe, sama datoteka kazalec Gotovo bila odprta za branje. Ne moremo prebrati znak iz datoteke kazalec, da smo odprli za pisanje. Tako, da je eden izmed omejitve fopen, kajne? Moramo omejiti sami, da le opravlja ena operacija z eno datoteko kazalcem. Če smo želeli, da se glasi, in pisati iz iste datoteke, bi imeli odprt dve ločeni datotek kazalci na istem file-- eden za branje, eno za pisanje. Torej še enkrat, edini razlog, Jaz bi, da je do sedaj ker če bomo za klic da fgetc, da datoteka kazalec Gotovo bila odprta za branje. In potem zelo preprosto, vse, kar morate storiti, se prenese na ime datotečnega kazalca. Torej char ch enaka fgetc ptr1. To se dogaja, da naju Naslednji character-- ali še enkrat, če je to prva čas smo naredili ta klic, prvi character-- kateregakoli Datoteka je poudaril, da ga ptr1. Spomnimo se, da je to datoteka 1 pika besedilo. To bomo dobili prvi znak, da je in bomo jo shranite v spremenljivko ch. Precej preprosta. Tako smo si ogledali le na treh funkcije in že smo Lahko narediš nekaj zelo čeden. Torej, če vzamemo to sposobnost dobili znak in mi zanka tako it-- smo naprej, da bi dobili znake iz datoteke znova in več in over-- zdaj smo lahko prebere vsak značaj datoteko. In če bomo natisniti vsak znak Takoj po tem, ko smo ga prebrali, smo zdaj brati iz datoteke in tiskani njeno vsebino na zaslonu. Mi smo dejansko združena z verigo da je datoteka na zaslonu. In to je tisto, kar Linux ukaz cat počne. Če vnesete mačka v imenu datoteke je, bo izpisal celotno vsebino datoteke v vašem terminalsko okno. In tako ta mali zanka tukaj, le tri vrstice kode, vendar dejansko podvaja ukaz cat Linux. Torej, to sintakso morda poglej malo čudno, ampak tukaj je, kaj se tukaj dogaja. Medtem ch enaka fgetc, PTR ni enako EOF-- je cela zalogaja, ampak kaj je prekinil dol samo tako da je jasno, o skladnji. Sem jo konsolidirajo zaradi omejenega prostora čeprav je malo skladenjsko zapleteno. Torej, ta del v zeleni pravice Zdaj, kaj počne? No, to je samo naša fgetc klic, kajne? Videli smo, da je pred. To je pridobivanje enega lik iz spisa. Potem smo primerjajte značaj proti EOF. EOF je posebna vrednost, ki je opredeljeno v standardu io.h, ki je konec datoteke značaja. Torej v bistvu, kaj se bo zgodilo se bo ta zanka prebrati znak, ga primerjajte z EOF je konec datoteke značaja. Če se ne ujemajo, tako da imamo ne dosegel konec datoteke, bomo natisnite ta lik ven. Potem smo šli nazaj na začetkom zanke znova. Bomo dobili znak, preverite proti EOF, ga natisnite, in tako naprej in tako naprej in tako naprej, zanka skozi ta način dokler ne bomo prišli do konca datoteke. In potem ga v tej točki, Vam bo natisnjen iz celotne vsebine datoteke. Torej še enkrat, smo videli samo fopen, fclose in fgetc in že smo lahko dvojnik terminal ukaz Linux. Kot sem rekel na začetku, smo imeli fgetc in fputc, in fputc bil spremljevalec funkcija fgetc. In tako, kot si lahko predstavljate, je enakovredno pisanje. To nam omogoča, da napišete sam znak v datoteko. Again, opozorilo pa, samo tako kot je bilo z fgetc, datoteka da smo pisno Gotovo je odpreti za pisanje ali za slepič. Če bomo poskušali uporabiti fputc na datoteko da smo odprli za branje, bomo trpeli malo napako. Toda klic je zelo preprosta. fputc kapitalska ptr2 vse da se dogaja, da storiti, je, da je dogaja, da napišete pismo v A v datoteki 2 piki besedilo, ki je ime izmed datoteko, da smo odprli in dodeljena kazalec ptr2. Torej bomo napisati Kapital A do datoteke 2 dot besedilo. In bomo napisati vzklik kažejo na datoteko 3 dot Besedilo, ki ga je opozoril, da ga ptr3. Torej še enkrat, precej preprosta tukaj. Zdaj pa lahko storimo še ena stvar. Imamo ta primer smo le, da bo več o tem, da bi lahko posnemati mačka Linux ukaz, tisti, ki natisne na zaslon. No, zdaj, ko imamo možnost, za branje znakov iz datoteke in pisati znake datotek zakaj ne bomo samo nadomestek, ki pokličite na printf s pozivom, naj fputc. In zdaj smo podvojene CP ukaz zelo osnovni Linux da smo se pogovarjali o tako dolgo nazaj na Linux ukazi video. Dejansko smo jih podvojiti, da prav tukaj. Mi berete znak in potem smo pisanje to znak druge datoteke. Branje iz ene datoteke, pisanje v drugo, znova in znova in znova, dokler ne bomo zadeli EOF. Imamo do konca datoteko smo poskušali kopirati. In da bomo bili napisani vsi znakov moramo spisa da smo pisno. Torej, to je cp, ukaz copy Linux. Na samem začetku ta video, sem imel opozorilo da bi talk malo o kazalci. Tu je še posebej, kadar smo govorili o kazalcev Poleg tega, da vloži kazalce. Torej ta funkcija izgleda nekako strašljivo. Ima več parametrov. Tam je veliko dogaja. Obstaja veliko različnih Barve in besedil. Ampak res, to je samo generična različica fgetc ki nam omogoča, da bi dobili koli količina informacij. To je lahko nekoliko neučinkovit, če smo pridobivanje znake enega naenkrat, ponavljanjem skozi datoteko en znak naenkrat. Ali ne bi bilo lepše, da bi dobili 100 naenkrat ali 500 naenkrat? No, fread in njen spremljevalec funkcija fwrite, ki bomo govorili o v drugo, nam omogočajo, da ne samo to. Mi lahko preberete poljubno količino podatkov iz datoteke in jo shranite nekam začasno. Namesto da bi bili sposobni le da se prilega v enem spremenljivko bomo morda morali shraniti v matriki. In tako, se peljemo v štirih argumenti za fread-- kazalec do mesta, kjer smo si gre za shranjevanje podatkov, kako velika vsaka enota informacij bo, koliko enot informacij želimo pridobiti, in iz katere datoteke želimo dobiti. Verjetno najbolje ponazorjeno s primerom tukaj. Torej, recimo, da izjavljamo niz 10 števil. Pravkar smo izjavil na kup samovoljno int arr 10. Torej, to je precej preprosta. Kaj delamo, čeprav je zdaj frecall se mi bereš velikost int krat 10 bajtov podatkov. Velikost int bitja four-- da je velikost celo število v c. Torej, kaj delamo, je, da smo berete 40 bajtov vredno informacij Iz spisa je poudaril, da ga PTR. In smo shranjevanje tistih, 40 bajtov nekje kjer smo v prahi 40 bajtov vredno spomina. Na srečo smo že storili, da jih razglasitvi arr, da matrika tam. Da je sposoben gospodarstva 10 štirih bajtov enote. Torej skupaj, lahko pa imajo 40 bajtov vredno informacij. In mi smo zdaj branje 40 bajtov informacij iz spisa, in smo jo shranite v ARR. Spomnimo iz video na kazalce, ki ime paleto, kot ARR je res samo kazalec na svojem prvem elementu. Torej, ko se peljemo v ARR tam, smo so v bistvu poteka v kazalca. Podobno lahko storimo this-- ne bomo nujno morali rešiti naš buffer na sklad. Lahko bi tudi dinamično dodeli buffer, kot je ta, s pomočjo malloc. Ne pozabite, ko smo dinamično dodeliti pomnilnika, smo ga shranili na kup, ne dimnika. Ampak to je še vedno buffer. Še vedno, v tem primeru je držite 640 bajtov informacij ker dvojni traja do osem bajtov. In smo prosi za 80 od njih. Želimo, da imajo prostor da imajo 80 podvoji. Torej 80 krat 8 je 640 bajtov informacij. In da je poziv k fread je zbiranje 640 bajtov informacij od datoteka opozoril, ki jih PTR in shranjevanje zdaj arr2. Zdaj smo lahko zdravi tudi fread tako kot poziv k fgetc. V tem primeru smo samo poskušam dobili en znak iz datoteke. In mi ne potrebujejo array imajo značaj. Mi lahko samo shranite v spremenljiv značaj. Ulov, pa je, da ko imamo samo spremenljivko, moramo opraviti v naslov te spremenljivke ker Spomnimo, da je Prvi argument fread je kazalec na mesto in spomin kjer želimo shranjevanje podatkov. Again, ime Niz je kazalec. Tako da nam ni treba storiti ampersand paleto. Ampak c, znak C tu ni niz. To je samo spremenljivka. In zato moramo opraviti ampersand c navesti da to je naslov, kjer želimo shraniti to en bajt informacij, to en znak, da je bomo zbiranje iz PTR. Fwrite-- bom šel skozi to malo bolj quickly-- je precej Točen ekvivalent fread razen, da je za pisanje Namesto branja, samo všeč other-- smo imeli odprto in blizu, dobil značaj, napisati značaj. Zdaj je dobil samovoljno količina informacij, Pravica poljubna količina informacij. Torej, tako kot prej, smo lahko imajo celo paleto 10 števil kjer že imamo shranjeni podatki, morda. Verjetno je nekaj vrstic kode da bi morali iti med tema dvema kjer sem izpolnite arr z nekaj smiselna. Jaz ga napolnite z 10 različnih števil. In namesto tega, kar sem početje je pisanje iz ARR in zbiranje informacij iz ARR. In jaz peljem, da so informacije in ga je dala v datoteko. Torej, namesto da bi bilo iz datoteka za buffer, smo zdaj gredo iz varovalni do datoteke. Torej, to je samo obratno. Torej še enkrat, tako kot prej, smo lahko imajo tudi kup kos pomnilnika ki smo jih dinamično dodeljena in berejo od in pisati, da v spisu. In imamo tudi posamezno variabilno sposoben držati en bajt informacij, kot znak. Ampak še enkrat, moramo opraviti v naslov te spremenljivke kadar želimo brati iz njega. Tako bomo lahko napisali podatke najdemo na tem naslovu v datotečni kazalec, PTR. Obstaja veliko drugih super datotek I / O funkcije da do različnih stvari, poleg tisti, ki smo govorili danes. Nekaj ​​tistih boste morda našli koristne so fgets in fputs, ki so enakovredne od fgetc in fputc, ampak za branje en sam niz iz datoteke. Namesto ene same značaja, bo prebral celoten niz. fprintf, ki v osnovi omogoča vas, da uporabite printf pisati v datoteko. Torej, tako kot lahko storite spremenljivka nadomeščanje uporabe Ograde odstotkov i in odstotkov d, in tako naprej, pri čemer printf lahko podobno vzemite printf niz in tiskanje nekaj kot da v datoteko. fseek-- če imate DVD predvajalnik je analogija sem ponavadi uporabljajo here-- je nekako tako kot z uporabo vašega previjanje in hitro naprej gumbi za premikanje po film. Podobno se lahko premikate po datoteki. Ena od stvari, znotraj da datoteke struktura da je c ustvarja za vas je kazalnik kje ste v datoteki. Ali ste na samem se začnejo na zlog ničelni? Ali ste na bajta 100, bajt 1000, in tako naprej? Lahko uporabite fseek samovoljno premikanje da kazalec naprej ali nazaj. In ftell, spet podobno kot DVD predvajalnik, je kot majhen uro, ki pove, si, koliko minut in vas sekund so v določenem film. Podobno ftell, kako pove veliko bajtov ste v datoteko. feof je drugačna različica odkrivanja ali ste dosegel konec datoteke. In ferror je funkcija ki jih lahko uporabite za ugotavljanje, ali ima nekaj narobe delo z datoteko. Tudi to je samo praskanje površine. Obstaja še veliko več datotek I / O Funkcije v standardni io.h. Vendar bo to verjetno dobili začel delati z datoteko kazalci. Sem Doug Lloyd. To je CS50.