>> Előadó: Eddig, akkor valószínű, hogy a legtöbb program
már egy kicsit mulandó.
Egy olyan programot futtat, mint a Mario és kapzsi.
Ez nem valami, akkor talán kéri a felhasználó valamilyen információt,
print néhány kimenetét a képernyőre, de aztán amikor a program vége,
már tényleg nincs bizonyíték van azt botlott az első helyen.
Úgy értem, persze, lehet, hogy nem engedélyezte ez megnyitja a terminál ablakban,
de ha törli a képernyőt, van Tényleg nincs bizonyíték, hogy létezik.
Jelenleg nincs történő tárolásának kitartó információk,
hogy létezik miután a programot leállt,
vagy mi nem a pontig.
Szerencsére azonban a C-nek biztosítja számunkra a képességét,
Ehhez a végrehajtási egy úgynevezett
egy fájl, egy szerkezet, amely alapvetően képvisel olyan fájl, amelyet a kétszeresére nőne
kattintson a számítógépen, ha használt grafikus felhasználói környezetet.
Általában, ha dolgozik ac vagyunk valójában
fog együtt dolgozni mutatókat files-- fájl stars--
kivéve egy kicsit amikor arról beszélünk, egy pár
A funkciók dolgozni fájl mutató.
Nem kell, hogy valóban ástak túl mélyen megértést mutató
magukat.
Van egy kis pici kicsit ahol fogunk beszélni velük,
de általában fájl mutatók és mutatók, miközben egymással,
nem pontosan ugyanaz a dolog.
>> Most mit gondolok, amikor Azt mondom megmaradó adatokat?
Mi megmaradó adatokat?
Miért érdekel ez?
Mondjuk, például, hogy futsz egy programot
vagy ha már átírták a program, amely egy játék,
és szeretné nyomon követni minden a felhasználó mozog
így talán, ha valami elromlik, akkor megtekintheti a fájlt a meccs után.
Ez az, amit értünk az alatt, beszélni megmaradó adatokat.
>> Ennek során a futás a program, a fájl jön létre.
És amikor a program leállt,
hogy a fájl még létezik a rendszeren.
És nézd meg, és vizsgáljuk meg.
És úgy, hogy a program lenne beállítva létrehozott néhány megmaradó adatokat,
adat áll rendelkezésre a program után befejezte működését.
>> Most mindezen funkciókat, hogy a munka A fájlok létrehozását és manipulálni
őket különböző módokon él szabvány io.h,
ami egy fejlécfájlból amit valószínűleg már font
beleértve a tetején szép sokat az összes programot
mert tartalmazza az egyik leghasznosabb funkciója a számunkra,
printf, hogy azt is lehetővé teszi él szabvány io.h.
Szóval nem kell verni közé további fájlokat valószínűleg
annak érdekében, hogy működjön együtt a fájl mutató.
>> Most minden egyes fájl pointer funkció, vagy minden egyes fájl I / O, input-output
funkciót, elfogadja, mint az egyik a paraméterei vagy bemenetek
Fájl pointer-- kivéve egy, fopen, amely
az, amit használni, hogy a fájl mutatót az első helyen.
De miután megnyitotta a fájlt, és kapsz fájl mutatók,
akkor majd át őket érvek a különböző funkciók
fogunk beszélni ma, valamint sokan mások
így dolgozni fájlokat.
>> Szóval van hat szép közös alap is
hogy fogunk ma beszélni.
fopen és társa funkciót fclose, fgetc
és társa funkció fputc, és fread és társa funkció,
fwrite.
Szóval ne is menjünk bele.
>> fopen-- mit csinál?
Nos, ez megnyitja a fájlt, és ez ad egy fájl mutatót úgy,
így lehet majd használni, hogy fájlpointer érvként
bármely más fájl I / O funkciókat.
A legfontosabb dolog emlékezni a fopen
az, hogy miután megnyitotta a fájl vagy egy hívást, mint az egyik itt,
akkor ellenőrizni kell, hogy győződjön meg arról, hogy a mutató, amit kaptam vissza
nem egyenlő null.
Ha még nem nézte a videót mutatók, ez lehet, hogy nem sok értelme.
De ha megpróbálod dereference null pointer visszahívás
a program valószínűleg szenvedni szegmentációs [hallható].
Azt szeretnénk, hogy győződjön meg arról, hogy mi Van egy legitim mutatót vissza.
A túlnyomó többség az idő fogunk ütött jogos mutatót vissza
és ez nem lesz probléma.
>> Szóval hogyan lehet hívást kezdeményezni, hogy a fopen?
Úgy néz ki elég jól, mint ez.
Fájl csillagos ptr-- ptr, hogy egy generikus nevet fájl pointer-- fopen
és átadjuk a két dolog, a fájl nevét és egy műveletet akarunk vállalni.
Tehát lehet, hogy egy hívást, hogy néz ki, mint this-- fájl csillagos PTR 1értéke fopen
file1.txt.
És a művelet az általam kiválasztott r.
>> Szóval mit gondolsz r van itt?
Melyek a fajta dolog, amit képes lehet csinálni, hogy a fájlokat?
Tehát R az a művelet, hogy mi választani, ha azt akarjuk, hogy olvassa el a fájlt.
Tehát mi lenne, ha alapvetően teszünk egy hívást, mint ez
egyre magunknak egy fájl mutatót úgy, hogy tudnánk, akkor olvass információk
re file1.txt.
>> Hasonlóképpen, mi lehetett megnyitni a fájlt 2.txt írásra, és így tudjuk átadni ptr2,
A fájl mutatót hoztam létre itt, érvként minden olyan funkciót,
írja az információt egy fájlt.
És hasonló írást, ott is a lehetőséget, hogy csatolja, a.
A különbség írásban és mellékelik
az, hogy ha írsz egy fájlba, Ha egy hívást, hogy a fopen írásra
és hogy a fájl már létezik, ez megy, hogy felülírja a teljes fájlt.
Meg fog kezdeni a legelején,
törli az összes információt ez már ott van.
>> Mivel ha kinyitja hozzáfűzve, akkor megy a végén a fájl
ha már van egy szöveg ez vagy információ van,
és ez lesz majd indítsa írásban onnan.
Így nem vesznek el a információt, amit eddig csináltunk.
Akár akarod, hogy írjon, vagy hozzáfűzni fajta helyzettől függ.
De akkor valószínűleg tudja, mi a jobb működésre, amikor eljön az ideje.
Szóval ez fopen.
>> Mi a helyzet fclose?
Nos, elég egyszerűen, fclose Csak elfogadja a fájl mutatót.
És ahogy az várható, bezárja a fájlt.
És ha egyszer már lezárt egy fájlt, nem tudjuk végezzen több fájl I / O funkciók,
olvasás vagy az írás, az adott fájlt.
Van, hogy újra megnyitja a fájlt egy másik alkalommal érdekében
folytatni a munkát ez használ az I / O funkciókat.
Tehát fclose eszközökkel végünk dolgozó ezt a fájlt.
És minden, amit kell, hogy adja át a van A fájl neve mutatót.
Tehát egy pár csúszik ezelőtt, fopened fájl 1 pont szövege olvasásra
és mi rendelt, hogy fájlpointer hogy ptr1.
Most úgy döntöttünk, mi vagyunk tenni az olvasást a fájlból.
Nem kell semmilyen többet vele.
Mi is csak fclose ptr1.
És hasonlóképpen, tudnánk fclose a többinek.
Minden rendben.
Szóval ez nyitása és zárása.
Ez a két alap beindítására.
>> Most szeretnénk ténylegesen csinálni néhány érdekes dolgot,
és az első funkció, hogy mi lesz látom, hogy meg fog tenni, hogy fgetc--
fájlt kap egy karaktert.
Ez az, amit általában fgetc ami lefordítja.
A célja az életben, hogy olvasd el a következő karaktert,
vagy ha ez az igen első hívást fgetc
Egy adott fájl, Az első karakter.
De aztán utána, kap a következő,
már a következő karakter az adott fájl, és eltárolja egy karakter változó.
Ahogy itt tettetek, char ch egyenlő fgetc,
át a fájl nevét mutató.
Ismét, ez nagyon Fontos itt megjegyezni
hogy annak érdekében, hogy A művelet sikeres,
A fájl mutatót maga Biztos bontott olvasásra.
Nem tudunk olvasni egy karaktert fájlból mutatót, hogy megnyílt az íráshoz.
Szóval ez az egyik korlátai fopen, ugye?
Meg kell korlátozására magunkat csak végző
Egy művelet egy fájl mutatót.
Ha akarnánk olvasni, és levelet ugyanabból a fájlból,
mi lett volna nyitva két különböző fájl mutatókat azonos file--
Egy olvasásra, egy írásra.
>> Tehát újra, az egyetlen ok, Hozom, hogy most van
mert ha megyünk, hogy a hívást hogy fgetc, hogy a fájl pointer Biztos
bontott olvasásra.
És akkor elég egyszerűen, minden, amit tennie kell,
van át a fájl nevét mutató.
Tehát char ch egyenlő fgetc ptr1.
>> Ez lesz, hogy minket A következő character--
vagy újra, ha ez az első alkalommal tettük ezt a hívást,
Az első character-- bármilyen fájl által mutatott ptr1.
Emlékezzünk vissza, hogy ez volt a fájl 1 pont szövegét.
Ez kapsz az első karakter, hogy és mi tároljuk a változó ch.
Elég egyértelmű.
Így már csak nézett három funkciók és már azt
tehet valamit elég ügyes.
>> Tehát ha vesszük ezt a képességet kapok egy karakter
és mi hurok it-- így továbbra is kap karakter
fájlból újra és újra és over-- most
Elolvashatja minden egyes karakter egy fájlt.
És ha nyomtatni minden karaktert Közvetlenül azután, hogy elolvasta,
most már olvasni egy fájlt, és nyomtatott tartalmát a képernyőn.
Már hatékonyan összefűzött ez a fájl a képernyőn.
És ez az, amit a Linux parancssori macska nem.
>> Ha beírjuk macska a fájl nevét, akkor kiírja a teljes tartalmát
A fájlt a terminál ablakban.
És így ez a kis hurok van, csak három sornyi kódot,
de hatékonyan megkétszerezi A Linux parancsot macska.
Tehát ez a szintaxis talán Egy kicsit furcsa,
de itt mi történik itt.
Míg ch egyenlő fgetc, PTR nem egyenlő EOF-- ez egy teljesen falatot,
de nézzük lebontani, csak így ez egyértelmű, a szintaxis.
Már konszolidált ez kedvéért a tér,
bár ez egy kicsit mondattanilag trükkös.
>> Szóval ez a része a zöld a jobb Most, hogy mi csinálja?
Nos, ez csak a mi fgetc döntök, ugye?
Láttuk, hogy mielőtt.
Ez megszerzésének egyik karaktert a fájl.
Aztán összehasonlítani, hogy karakter ellen EOF.
EOF külön értéke, hogy ez szabványban meghatározott io.h, amely
a fájl vége karakterrel.
Tehát alapvetően mi fog történni van ez a hurok beolvas egy karaktert,
hasonlítsa össze a EOF, a fájl vége karakterrel.
Ha nem egyezik, így már nem végére ért a fájl,
fogunk nyomtatni, hogy a karakter ki.
Akkor menj vissza a a ciklus kezdetén újra.
Veszünk egy karaktert, ellenőrizze ellen EOF, nyomtassa ki, és így tovább
és így tovább, és így tovább, áthurkolást ily módon
amíg elértük a fájl végéhez.
És akkor addigra, mi lesz a nyomtatott
ki az egész a fájl tartalmát.
Tehát újra, még csak láttam fopen, fclose, és fgetc
és már tudjuk másolni Linux terminál parancsot.
>> Mint mondtam az elején, mi volt fgetc és fputc,
és fputc volt a társa funkciója fgetc.
És így, ahogy lehet képzelni, ez az írás egyenértékű.
Ez lehetővé teszi számunkra, hogy írjon egy egyetlen karakter egy fájlba.
>> Ismét a fenntartással, hogy, csak mintha a fgetc, a fájl
hogy írunk, hogy lehettem írásra megnyitni vagy mellékelik.
Ha megpróbáljuk, és használja fputc egy fájlt hogy már olvasásra megnyitott,
fogunk szenvedni Egy kis hiba.
De a hívást elég egyszerű.
fputc főváros Egy ptr2, minden hogy meg fog tenni az ez
fog írni a levelet az A fájlba 2 pont
szöveget, amely a nevét a fájlt, hogy megnyílt és hozzárendelt
A mutatót ptr2.
Szóval megyünk levelet tőke egy fájlba 2 pont szövegét.
És akkor írj egy felkiáltójel pont fájlba 3 pont
szöveg, amelyet által mutatott ptr3.
Tehát újra, nagyon egyszerű itt.
>> De most már nem egy másik dolog.
Van ez a példa mi éppen megy át
, hogy képes lemásolni a macska Linux parancssori, az egyik, hogy kiírja
a képernyőre.
Nos, most, hogy megvan a képessége, olvasni karaktert fájlok
és írd karakterek fájlokat, miért nem csak helyettesíti, hogy
hívja a printf egy hívást, hogy fputc.
>> És most már duplikált cp, egy nagyon alap Linux parancs
hogy beszélgettünk módon hosszú ezelőtt a Linux parancsok videót.
Már hatékonyan sokszorosítani, hogy itt van.
Mi olvasod egy karaktert, akkor nem vagyunk írásban, hogy a karakter egy másik fájl.
Reading egy fájlt, írásban Egy másik, újra és újra
és újra, amíg elérünk EOF.
Van, hogy a végén a fájlt próbálunk másolni.
És hogy mi lesz írva A karakter van szükségünk, hogy a fájl
hogy mi írásban.
Szóval ez cp, a Linux másolás parancsot.
>> A legelején ezt a videót, az volt a kikötés
hogy mi lenne beszélni egy kicsit mutatók.
Itt konkrétan hol vagyunk fogok beszélni mutatók
amellett, hogy a fájl mutatók.
Szóval ez a funkció néz ki, milyen ijesztő.
Van rajta néhány paramétert.
Van egy csomó folyik itt.
Van egy csomó más színek és szövegek.
De tényleg, ez csak a generikus változata fgetc
amely lehetővé teszi számunkra, hogy minden mennyiségű információt.
Ez lehet egy kicsit nem hatékony, ha mi vagyunk egyre karakterek egyesével,
iterációjával át a fájlt Egy karakter egy időben.
Nem lenne szebb, hogy 100 egy időben, vagy 500 egy időben?
>> Nos, fread és társa funkció fwrite, amely fogunk beszélni,
egy második, lehetővé teszi számunkra, hogy nem csak ezt.
Olvashatunk egy tetszőleges összeget Az egy fájlból
és tároljuk valahol ideiglenesen.
Ahelyett, hogy képes csak fér meg egy-egy változó,
szükségünk lehet tárolni egy tömbben.
És így haladunk, négy érvek fread-- egy mutatót
arra a helyre, ahol mi vagyunk megy, hogy információt tároljon,
mekkora legyen az információ egysége lesz, hány egysége információk
akarunk szerezni, és amely fájlt szeretnénk kapni őket.
Valószínűleg jól illusztrálja egy példa van.
Tehát mondjuk, hogy kijelentjük egy sor 10 egészek.
Már csak nyilvánította a verem önkényesen int tomb 10.
Szóval ez elég egyértelmű.
Most mit csinálunk, bár a frecall a mi olvasod mérete int
szor 10 byte információt.
Mérete int lény four-- ez a méret egész szám C.
>> Szóval mit csinálunk a mi olvasod 40 bájtos információk
A fájl által mutatott PTR.
És mi tárolására azoknak 40 bájt valahol
ahol már félre 40 bájtos memória.
Szerencsére ezt már megtettük, hogy a nyilvánító arr, hogy tömb ott.
Amely képes a gazdaság 10 négy-bájtos egységekben.
Tehát összesen, képes tárolni 40 bájtos adatok.
És most olvasott 40 bájt Az információt a fájlból,
és mi tárolja azt arr.
>> Emlékezzünk a videót a mutatók, amelyek A tömb neve, mint például arr,
tényleg csak egy mutató az első elemére.
Tehát amikor átadjuk az arr ott, mi vannak, sőt, átadva a mutatót.
>> Hasonlóan tehetünk this-- Mi nem feltétlenül
meg kell menteni a puffer a verem.
Azt is dinamikusan osztja egy puffer, mint ez, a malloc.
Ne feledje, ha dinamikusan memóriát foglalni,
mi mentés a kupac, nem verem.
De ez még mindig egy puffer.
>> Ez még mindig, ebben az esetben, az gazdaság 640 byte-információk
mert egy dupla vesz fel nyolc bájt.
Illetve kérünk a 80 közülük.
Azt akarjuk, hogy legyen hely hogy tartsa 80 páros.
Tehát 80-szer 8 640 byte információt.
És, hogy hívás fread van gyűjtő 640 bájtnyi információ
A fájl által mutatott ptr, és tárolja azt most arr2.
>> Most mi is kezelni fread mint egy hívást fgetc.
Ebben az esetben mi csak próbálunk kap egy karaktert a fájl.
És nem kell egy tömb, hogy tartsa egy karaktert.
Mi is csak tárolja egy karakter változó.
>> A fogás, de az, hogy amikor már csak egy változó,
meg kell, hogy adja át a változó címére
mert emlékeztetnek arra, hogy a első érv, hogy fread
egy mutató a helyét és a memória ahol szeretnénk tárolni az adatokat.
Ismét a nevét egy tömb egy mutató.
Tehát nem kell tennie, és jelet tömb.
De c, c karaktert Itt nem egy tömb.
Ez csak egy változót.
És ezért meg kell tennie jelet c, jelezve,
hogy ez a cím, ahol szeretnénk hogy tárolja ezt egy byte információt,
ez egy karakter, hogy mi gyűjt a PTR.
Fwrite-- átnézzük ez egy kicsit több,
quickly-- nagyjából pontos megfelelője fread
kivéve ez az írás olvasás helyett, csak
mint a other-- már volt nyitva és szoros, hogy egy karaktert,
levelet karakter.
Most itt az, hogy az önkényes mennyiségű információt,
jobb tetszőleges mennyiségű információ.
Szóval csak úgy, mint korábban, nem tudjuk Van egy sor 10 egészek
ahol már van tárolt információ, talán.
>> Ez volt talán néhány sornyi kódot hogy kell menni a két
ahol töltse arr a valami értelmes.
Én töltse fel 10 különböző egész számok.
És ahelyett, hogy mire vagyok Ennek az írásbeli arr
és információk begyűjtése arr.
És én viszem ezt az információt és üzembe helyezése a fájlt.
>> Így ahelyett, hogy azt honnan A fájlt a puffert,
mi most megy a a puffer a fájlt.
Tehát csak fordítva.
Tehát újra, csak úgy, mint korábban, nem tudjuk is van egy halom darab memória
hogy már dinamikusan kiosztott és olvasni, hogy
és azt írja, hogy a fájl.
>> És mi is van egy változó képes a gazdaság egy byte
az információk, mint például egy karaktert.
De ismétlem, meg kell, hogy adja át a A változó címére
ha azt akarjuk, hogy olvassa el azt.
Így tudjuk írni az információkat találunk arra a címre
A fájl mutatót, ptr.
>> Van sok más nagy file I / O funkciók
amelyek különböző dolgok mellett az is beszéltünk ma.
Pár azok lehet hasznos
a fgets és fputs, amelyek az egyenértékű
A fgetc és fputc de az olvasás egyetlen karakterlánc fájlból.
Ahelyett, hogy egy karakter, akkor olvastam egy egész szöveget.
fprintf, ami alapvetően lehetővé teszi, hogy használja printf, hogy a fájlba.
Szóval, mint amit tehetünk a változó helyettesítés
helyőrzővel százalékkal i és százalék d, és így tovább, a printf
akkor hasonlóképpen tegyen a printf string és a nyomtatási valamit
mint, hogy egy fájlt.
>> fseek-- ha van egy DVD-lejátszó az analógia szoktam használni here--
a fajta, mint használja a áttekercselés
gombok segítségével mozoghat a filmet.
Hasonlóképpen lehet mozogni a fájlt.
Az egyik dolog benne hogy a fájl szerkezetét
hogy c teremt az Ön számára egy olyan mutató, hogy hol van a fájl.
Ön a nagyon kezdődő, a byte nulla?
Ön a byte-100, bájt 1000, és így tovább?
Használhatja fseek önkényesen mozog ezt a mutatót előre vagy hátra.
>> És ftell, újra hasonló a DVD-lejátszó,
olyan, mint egy kis órát, ami megmondja hány perc és másodperc Önnek
van egy adott filmet.
Hasonlóképpen, ftell megmondja, hogyan hány bájt van a fájl.
feof egy másik verziója felderítése Akár már
végére ért a fájl.
És ferror függvénye hogy tudod használni
felismerni, hogy valamit elrontottunk dolgozik egy fájlt.
Ismét, ez csak vakarja a felületet.
Van még bőven több fájl I / O funkciók a standard io.h.
De ez valószínűleg neked kezdett dolgozni fájl mutató.
Én Doug Lloyd.
Ez CS50.