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.