>> 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.