SPEAKER: Zatiaľ je pravdepodobné, že väčšina vašich programov byť trochu pominuteľná. Spustiť program, ako Maria alebo chamtivý. Je to niečo robí, ale možno vyzve Užívateľ nejaké informácie, vytlačiť nejaký výstup na obrazovku, ale potom, keď váš program je po všetkom, je to naozaj neexistuje žiadny dôkaz, vôbec bola spustený v prvom rade. Chcem povedať, jasne, možno ste odišiel otvorí v terminálovom okne, ale ak vymazať obrazovku, je tu Naozaj žiadny dôkaz o tom, že to existuje. Nemáme prostriedky na ukladanie perzistentné informácie, informácie že existuje po našom Program bola zastavená, alebo nemáme až do tohto bodu. Našťastie však, c robí nám poskytujú možnosť na to tým, že sa vykonáva niečo, čo nazýva súbor, štruktúra, ktorá v zásade predstavuje súbor, ktorý by zdvojnásobiť kliknite na vašom počítači, ak ste slúži k grafického užívateľského prostredia. Všeobecne pri práci s c, my sme vlastne bude pracovať s ukazovatele na files-- súbor stars-- až na trochu keď hovoríme o pár z funkcií, ktoré pracovať s ukazovateľmi súborov. Nemusíte mať naozaj vykopali príliš hlboko do chápania ukazovateľov samy o sebe. Je tu trochu malinký kúsok kde budeme hovoriť o nich, ale všeobecne súbor ukazovateľov a ukazovatele, zatiaľ čo vzájomne prepojené, nie sú presne to isté. Čo teraz mám na mysli, keď Hovorím trvalá dáta? Čo je to perzistentné údaje? Prečo sa nám záleží na tom? Povedzme, napríklad, že vediete program alebo ste prepísaný Program, ktorý je hra, a chcete mať prehľad zo všetkých pohybov užívateľa takže možno, ak sa niečo pokazí, si môžete prezrieť v súbore po zápase. To je to, čo máme na mysli, keď sme hovoriť o perzistentných dát. V priebehu spustením Program, je vytvorený súbor. A keď váš program bola zastavená, že súbor stále existuje vo vašom systéme. A môžeme sa na to pozrieť a preskúmať ho. A tak, aby program by byť nastavený na vytvorili niekoľko trvalých dát, Existujú údaje po programe ukončil svoj beh. Teraz sú všetky tieto funkcie, ktoré pracujú s vytváranie súborov a manipuláciu je rôznymi spôsobmi žiť v štandardnom IO.H, čo je súbor hlavičky, ktoré Vy ste pravdepodobne bola libra a to aj na hornej časti docela veľa všetkých vašich programov preto, že obsahuje jeden z nasledujúcich Najužitočnejšie je funkcia pre nás, printf, ktorá tiež umožňuje žije v štandardnom io.h. Takže nemusíte búšiť zahrnúť ďalšie súbory pravdepodobne Aby bolo možné pracovať s ukazovateľmi súborov. Teraz každý ukazovateľ funkcie súboru, alebo každý súbor I / O, vstup výstup funkcie, prijíma ako jeden jeho parametre alebo vstupy pointer-- súbor s výnimkou pre jedného, ​​fopen, ktorý je to, čo použiť na získanie súboru ukazovateľ na prvom mieste. Ale potom, čo ste otvorení súbor a dostanete ukazovatele súboru, potom môžete odovzdať ako Argumenty rôznych funkcií budeme hovoriť o tom, Dnes, rovnako ako mnoho ďalších takže môžete pracovať so súbormi. Takže tam je šesť dosť spoločné základné ones že budeme hovoriť o dnes. fopen a jeho spoločník Funkcie fclose, fgetc a jeho funkcie spoločník fputc, a fread a jeho spoločník funkcie, fwrite. Tak poďme priamo do nej. fopen-- čo to robí? No, to otvorí súbor, a to vám dáva ukazovateľ súboru na to, takže potom môžete použiť, že súbor ukazovateľ ako argument na niektorú z druhého súboru I / O funkcie. Najdôležitejšou vecou pamätať si s fopen je, že potom, čo ste otvoril súboru alebo kamsi zavolal, ako je tá tu, je potrebné skontrolovať, aby sa ubezpečil že ukazovateľ, že ste sa vrátili sa nerovná null. Ak ste sledovali video na ukazovatele, mohlo by to nedávalo zmysel. Ale ak sa pokúsite a dereferencia nulový ukazovateľ odvolanie, váš program bude pravdepodobne trpieť segmentácia [nepočuteľných]. Chceme, aby sa uistil, že sme dostal legitímne ukazovateľ chrbát. Drvivá väčšina času budeme sa dostali legitímne ukazovateľ späť a to nebude problém. Tak ako to urobíme volanie fopen? Vyzerá to skoro ako je tento. Súbor hviezda ptr-- PTR byť všeobecný meno pre súbor pointer-- fopen a míňame dve veci, názov súboru a operácie chceme podniknúť. Takže by sme mohli mať hovor, ktorý vyzerá ako tohle-- súbor hviezda ptr 1 rovná fopen file1.txt. A operácie som zvolil, je r. Takže to, čo si myslíte, že r je tu? Aké sú druhy vecí, ktoré sme mohol urobiť, aby súbory? Takže r je operácia, ktorá sme zvoliť, kedy chceme čítať súbor. Takže by sme v podstate, keď sme volať takhle sa dostať sami ukazovateľ súboru taká, že by sme mohli čítať informácie od file1.txt. Rovnako tak by sme mohli otvoriť súbor 2.txt pre písanie a tak môžeme prejsť ptr2, Súbor ukazovateľ som tu vytvoril, ako argument pre akúkoľvek funkciu, ktorá zapíše informácie do súboru. A podobne ako písanie, je tu tiež možnosť pripojiť, a. Rozdiel medzi písanie a pripojením v tom, že keď píšete do súboru, ak urobíte volanie fopen pre písanie a tento súbor už existuje, je to chystá prepísať celý súbor. Bude to začiatok na samom začiatku, odstránenie všetky informácie že už tam je. Vzhľadom k tomu, ak ho otvorený iba pre pripojenie, to pôjde na koniec súboru v prípade, že je už v texte ho alebo informácie v ňom, a bude potom začať písanie odtiaľ. Takže budete nestratili nič z Informácie, ktoré ste predtým. Či už chcete písať alebo pripojiť druh závisí od situácie. Ale pravdepodobne budete vedieť, čo právo operácie je, keď príde čas. Tak to je fopen. Čo fclose? No, celkom jednoducho, fclose práve prijíma ukazovateľ súboru. A ako sa dalo očakávať, zavrie tento súbor. A akonáhle sme uzavreli súbor, nemôžeme vykonávať žiadne ďalšie súbor I / O funkcie, čítania alebo zápisu na tomto súbore. Musíme znovu otvoriť súbor inokedy, aby pokračovať v práci s to pomocou I / O-funkcie. Takže fclose znamená, že sme hotoví prácu s týmto súborom. A všetko, čo potrebujeme, je odovzdať meno ukazovateľ v súbore. Takže o pár posunie pred sme fopened súbor 1 bod text pre čítanie a sme priradili, že súbor ukazovateľ na ptr1. Teraz sme sa rozhodli, že sme vykonáva čítanie z tohto súboru. Nepotrebujeme robiť viac s ním. Môžeme len fclose ptr1. A rovnako, mohli by sme fclose tie ostatné. Dobre. Tak to je otváranie a zatváranie. To sú dva základné začatí operácie. Teraz chceme skutočne urobiť nejaké zaujímavé veci, a prvá funkcia, že budeme vidieť, že to urobí, je fgetc-- podať si charakter. To je to, čo zvyčajne fgetc by sa premietajú do. Jeho životným cieľom je prečítať nasledujúce znak, alebo ak je to vaše veľmi Prvé volanie fgetc pre určitý súbor, prvý znak. Ale potom po tom, dostanete ďalší, hneď ďalší charakter tohto súboru, a ukladá ju do premennej znak. Ako sme tu urobili, char ch rovná fgetc, prejsť v mene ukazovateľ v súbore. Opäť platí, že je to veľmi tu dôležité mať na pamäti, že za účelom vykonania táto operácia úspešná, Súbor ukazovateľ sám musel bol otvorený pre čítanie. Nemôžeme čítať znak zo súboru ukazovateľ, ktorý sme otvorili pre zápis. Takže to je jedna z obmedzenia fopen, že jo? Musíme obmedziť aby sme sa iba vykonávania jedna operácia s jedným ukazovateľ v súbore. Ak by sme chceli čítať a napísať z rovnakého súboru, budeme mať otvorené dva samostatné ukazovatele súbor do rovnakej file-- jeden pre čítanie, jeden pre písanie. Takže znova, jediný dôvod, prečo Uvediem, že sa teraz je pretože ak budeme volať na fgetc, že ​​ukazovateľ súboru muselo bol otvorený pre čítanie. A potom celkom jednoducho, všetko, čo potrebujete urobiť, je prejsť v názve ukazovateľ v súbore. Takže char ch rovná fgetc ptr1. To bude, aby sme sa dostali ďalšie character-- alebo znovu, ak sa jedná o prvý Tentoraz sme urobili túto výzvu, prvý character-- akéhokoľvek súbor odkazuje ptr1. Pripomeňme si, že to bol súbor 1 bod textu. To bude mať prvé písmeno, ktoré a my uložiť ho do premennej ch. Celkom jednoduché. A tak sme sa len pozrel na tri funkcie a už sme môže niečo celkom čistý. Takže ak vezmeme túto schopnosť dostať znak a my slučka to-- tak sme naďalej dostávať znaky zo súboru znova a nad a over-- teraz sme môže čítať každý charakter súboru. A ak budeme tlačiť každý znak hneď po tom, čo sme si ho prečítali, sme teraz čítať zo súboru a tlačený jeho obsah na obrazovku. Sme účinne reťazcový tento súbor na obrazovke. A to je to, čo Linux príkaz cat robí. Ak zadáte mačka v názve súboru to, vytlačí celý obsah súboru v okne vášho terminálu. A tak táto malá slučka tu, iba tri riadky kódu, ale účinne zdvojuje Linux príkaz cat. Tak toto by mohlo syntaxe vyzerať trochu divne, ale tu je to, čo sa tu deje. Kým ch rovná fgetc, ptr nie je rovná EOF--, že je to celé sústo, ale poďme rozobrať to len takže je jasné, na syntax. Ja som to upevnil kvôli priestoru, aj keď je to trochu syntakticky zradné. Takže táto časť v zelenej vpravo A teraz, čo to robí? No, to je práve náš fgetc volania, že jo? Videli sme, že pred. Je to získanie jedného znak zo súboru. Potom sme sa porovnať, že znak proti OSZ. EOF je zvláštne hodnota, ktorá je definované v norme IO.H, ktorý je koniec súboru charakteru. Takže v podstate to, čo sa bude diať je táto slučka bude čítať znak, porovnať ju s EOF sa Koniec súboru charakteru. Ak sa nezhodujú, takže nemáme došiel na koniec súboru, budeme tlačiť tú postavu von. Potom sa vrátime do začiatok slučky znovu. Dostaneme charakter, skontrolujte proti OSZ, vytlačiť, a tak ďalej a tak ďalej, a tak ďalej, opakovanie prostredníctvom týmto spôsobom až sme došli na koniec súboru. A potom sa tým bodom, budeme mať vytlačené out celého obsahu spisu. Takže znovu, sme videli len fopen, fclose, a fgetc a už môžeme duplikovať terminálny príkaz Linux. Ako som povedal na začiatku, mali sme fgetc a fputc, a fputc bol spoločníkom funkcie fgetc. A tak, ako by ste si mohli predstaviť, to je ekvivalent písanie. To nám umožňuje napísať jeden znak do súboru. Opäť platí, že je námietka, len ako by to bolo s fgetc, súbor že sme písomne ​​musel byť otvoriť pre zápis alebo len pre pripojenie. Ak sa budeme snažiť a používať fputc na súbor že sme otvorený pre čítanie, budeme trpieť trochu omylom. Ale volanie je veľmi jednoduchý. fputc kapitálu ptr2, všetky že to bude robiť, je, že je to chystá napísať list do A do súboru 2 bodkou text, čo bolo meno toho súbor, ktorý sme otvorili a pridelený ukazovateľ na ptr2. Takže budeme napísať kapitál od A do súboru 2 dot text. A budeme písať výkrik poukazujú na súbore 3 bodka text, ktorý bol na ktorý ukazuje ptr3. Takže znovu, tu celkom jednoduché. Ale teraz môžeme robiť niečo iné. Máme tento príklad sme jednoducho ísť cez o schopnosti replikovať mačku Linux príkaz, ten, ktorý vytlačí na obrazovku. No, teraz, že máme schopnosť čítať znaky zo súborov a písať znaky do súborov, prečo nie my jednoducho nahradiť, že zavolať do printf s volaním fputc. A teraz sme duplicitné cp, veľmi základné príkaz Linux že sme hovorili o spôsob, ako dlho Pred v Linuxe príkazy videa. Máme skutočne som duplikované, že práve tu. Sme čítanie postavu a potom sme písania, že znak iného súboru. Čítanie z jedného súboru, písanie do druhého, znovu a znovu a znovu, kým sme narazili EOF. Musíme sa na konci súbor sa snažíme kopírovať. A tým, že budeme mať napísané postáv musíme súboru že sme písomne. Tak toto je cp, príkaz Linux kopírovanie. Na samom počiatku toto video, mal som námietku že by sme hovoriť Niečo málo o ukazovatele. Tu sa konkrétne, kde sme hovoriť o ukazovatele okrem súboru ukazovatele. Takže táto funkcia vyzerá desivo. Má to niekoľko parametrov. Je tu veľa deje. Je tu mnoho rôznych farby a texty. Ale vážne, je to len generické verzie fgetc ktorý nám umožňuje dostať nejakú množstvo informácií. To môže byť trochu neefektívne keď sme dostať znakov jeden po druhom, iterácie súboru jeden znak naraz. Nebolo by to byť krajšie sa dostať 100 v čase, alebo 500 v čase? No, fread a jeho spoločník funkcie fwrite, ktorý budeme hovoriť o tom, V druhej, nám umožňujú robiť len to. Môžeme prečítať ľubovoľnú čiastku informácií z súboru a uložíme ho niekde dočasne. Namiesto toho, že sa môže len vošiel v jednej premennej, by sme mohli potrebovať uložiť ho do poľa. A tak sme sa prejsť v štyroch argumenty fread-- ukazovateľ na miesto, kam máme sa na ukladanie informácií, ako veľké sú jednotlivé informačné jednotkou bude, koľko jednotiek informácií chceme získať, a od ktorý súbor chceme dostať. Pravdepodobne najlepšie dokazuje s príkladom tu. Takže povedzme, že prehlasujeme Pole 10 celých čísel. Práve sme deklaroval na stack ľubovoľne int arr 10. Tak to je celkom jednoduché. To, čo robíme, ale teraz je frecall sa budeme veľkosť int čítanie krát 10 bajtov informácií. Veľkosť int bytia four-- to je veľkosť celé číslo v C. Takže to, čo robíme je, že čítate 40 bytov v hodnote informácií zo súboru, na ktorý ukazuje PTR. A my sme tí, skladovanie 40 bytov niekde kde sme odložili 40 bytov v hodnote pamäti. Našťastie sme už urobili, že deklarovať arr, že pole tam. To je vhodné pre uchovávanie 10 štvorbajtovom jednotky. Takže celkom, to môže držať 40 bytov v hodnote informácií. A my sme práve čítate 40 bajtov informácií zo spisu, a my ukladania do arr. Pripomeňme z videa na ukazovatele, ktoré meno poľa, ako je napríklad arr, je naozaj len ukazovateľ k jeho prvému prvku. Takže keď sme sa prejsť v arr tam, sme sa sú v skutočnosti, odovzdaním ukazovateľ. Podobne môžeme urobiť tohle-- my nie nutne treba zachrániť naše vyrovnávacej pamäte v zásobníku. Tiež by sme mohli dynamicky prideľovať vyrovnávacia pamäť ako je tento, pomocou malloc. Pamätajte si, že keď sme sa dynamicky alokovať pamäť, sme jeho uloženie na haldy, nie zásobník. Ale je to stále vyrovnávacej pamäte. Stále, v tomto prípade je držanie 640 bajtov informácií pretože double zaberá osem bajtov. A žiadame pre 80 z nich. Chceme mať priestor držať 80 dvojlôžkových izieb. Tak 80 krát 8 640 bajtov informácie. A to je výzva na fread zbieranie 640 bajtov informácií zo súboru, na ktorý ukazuje PTR a ukladanie teraz v Arr2. Teraz môžeme liečiť fread rovnako ako volanie fgetc. V tomto prípade, my sme len sa snažia získať jeden znak zo súboru. A my nepotrebujú array držať znak. Môžeme len uložiť ho do variabilný znak. Úlovok, však je, že keď sme jednoducho premennú, musíme prejsť v Adresa tejto premennej Pripomeňme si, že preto, Prvý argument fread je ukazovateľ na umiestnenie a pamäti kde chceme uložiť informácie. Opäť platí, že na meno pole je ukazovateľ. Takže nepotrebujeme robiť ampersand poľa. Ale c, charakter c tu, nie je poľom. Je to len variabilné. A preto je treba zložiť ampersand c uviesť že to je adresa, kde chceme uložiť tento jeden bajt informácií, to jeden znak, ktorý sme zber z PTR. Fwrite-- Prejdem to trochu viac quickly-- je skoro presný ekvivalent fread s výnimkou, že je to pre písanie miesto čítanie, len rovnako ako other-- sme mali otvorené V blízkosti, si postavu, napísať znak. Teraz je to dostať ľubovoľná Množstvo informácií, právo ľubovoľné množstvo informácií. Takže rovnako ako predtým, môžeme majú celý rad 10 celých čísel kde už máme Informácie uložené, snáď. To bolo pravdepodobne niekoľko riadkov kódu že by mal ísť medzi týmito dvoma kde som naplniť arr sa niečo zmysluplné. Aj naplňte ju 10 rôznych čísel. A namiesto toho, čo ja som robí píše z arr a zhromažďovanie informácií od arr. A beriem, že informácie a uvedenie do súboru. Takže namiesto toho by bolo z súbor do vyrovnávacej pamäte, Teraz sa z vyrovnávacej pamäte do súboru. Takže je to práve naopak. Takže znovu, rovnako ako predtým, môžeme majú tiež haldy kus pamäte že máme dynamicky pridelené a čítať z toho a píšu, že do súboru. A máme tiež jednu premennú schopná pojať jeden bajt informácií, ako je charakter. Ale opäť, musíme odovzdať adresa tejto premennej keď chceme čítať z neho. Takže môžeme zapísať informácie nájdeme na tejto adrese na ukazovateľ v súbore, ptr. Je tu veľa iného veľký súbor I / O funkcie že robiť rôzne veci okrem toho tie, ktoré sme hovorili o dnešku. Pár z tých, môžete nájsť užitočné sú fgets a fputs, ktoré sú ekvivalentné z fgetc a fputc ale pre čítanie jediný reťazec zo súboru. Namiesto toho, jeden znak, to bude čítať celý reťazec. fprintf, ktorý v zásade umožňuje použiť printf zapisovať do súboru. Takže rovnako ako vy môžete urobiť Substitúcia premenných s použitím Symboly percent i a percent d, a tak ďalej, s printf môžete doneste printf reťazec a tlačiť niečo ako, že do súboru. fseek-- ak máte DVD prehrávač je analógia I obyčajne používajú here-- je niečo ako pomocou svojho pretočiť a rýchlo dopredu tlačidlá pre pohyb po filme. Podobne môžete pohybovať po súbore. Jednou z vecí, vnútri že štruktúra súboru že c vytvára pre vás je indikátor kde ste v súbore. Vy ste u veľmi začiatok, v byte nulovej? Ste na bajtu 100, Byte 1000, a tak ďalej? Môžete použiť fseek ľubovoľne pohybovať že ukazovateľ dopredu alebo dozadu. A ftell, znovu podobne ako DVD prehrávače, je ako malý hodiny, ktoré hovorí, vy, koľko minút a sekúnd sú do určitého filmu. Rovnako tak, ako vám povie ftell veľa bajtov ste do súboru. feof je iná verzia detekcia Či už ste došiel na koniec súboru. A ferror je funkcia ktoré môžete použiť zistiť, či má niečo pokazilo prácu so súborom. Znovu, toto je len poškriabaniu povrchu. Je tu ešte veľa ďalších súborov I / O funkcie v štandardnom io.h. Ale to bude pravdepodobne dostanete začal pracovať s ukazovateľmi súborov. Som Doug Lloyd. To je CS50.