SPEAKER: Zatím je pravděpodobné, že většina vašich programů být trochu pomíjivá. Spustit program, jako Maria nebo chamtivý. Je to něco dělá, ale možná vyzve Uživatel nějaké informace, vytisknout nějaký výstup na obrazovku, ale pak, když váš program je po všem, je to opravdu neexistuje žádný důkaz, vůbec byla spuštěn v první řadě. Chci říct, jasně, možná jste odešel otevře v terminálovém okně, ale pokud vymazat obrazovku, je tu Opravdu žádný důkaz o tom, že to existuje. Nemáme prostředky k ukládání perzistentní informace, informace že existuje po našem Program byla zastavena, nebo nemáme až do tohoto bodu. Naštěstí však, c dělá nám poskytují možnost na to tím, že se provádí něco, co nazývá soubor, struktura, která v zásadě představuje soubor, který by zdvojnásobit klikněte na vašem počítači, pokud jste slouží k grafického uživatelského prostředí. Obecně při práci s c, my jsme vlastně bude pracovat s ukazatele na files-- soubor stars-- až na trochu když hovoříme o pár z funkcí, které pracovat s ukazateli souborů. Nemusíte mít opravdu vykopali příliš hluboko do chápání ukazatelů oni sami. Je tu trochu malinký kousek kde budeme mluvit o nich, ale obecně soubor ukazatelů a ukazatele, zatímco vzájemně propojené, nejsou přesně totéž. Co teď mám na mysli, když Říkám trvalá data? Co je to perzistentní údaje? Proč se nám záleží na tom? Řekněme, například, že vedete program nebo jste přepsaný Program, který je hra, a chcete mít přehled ze všech pohybů uživatele takže možná, pokud se něco pokazí, si můžete prohlédnout v souboru po zápase. To je to, co máme na mysli, když jsme mluvit o perzistentních dat. V průběhu spuštěním Program, je vytvořen soubor. A když váš program byla zastavena, že soubor stále existuje ve vašem systému. A můžeme se na to podívat a prozkoumat ho. A tak, aby program by být nastaven na vytvořili několik trvalých dat, Existují údaje po programu ukončil svůj běh. Nyní jsou všechny tyto funkce, které pracují s vytváření souborů a manipulaci je různými způsoby žít ve standardním io.h, což je soubor záhlaví, které Vy jste pravděpodobně byla libra a to i na horní části docela hodně všech vašich programů proto, že obsahuje jeden z následujících Nejužitečnější je funkce pro nás, printf, která také umožňuje žije ve standardním io.h. Takže nemusíte bušit zahrnout další soubory pravděpodobně Aby bylo možné pracovat s ukazateli souborů. Nyní každý ukazatel funkce souboru, nebo každý soubor I / O, vstup výstup funkce, přijímá jako jeden jeho parametry nebo vstupy pointer-- soubor s výjimkou pro jednoho, fopen, který je to, co použít k získání souboru ukazatel na prvním místě. Ale poté, co jste otevření soubor a dostanete ukazatele souboru, pak můžete předat jako Argumenty různých funkcí budeme mluvit o tom, Dnes, stejně jako mnoho dalších takže můžete pracovat se soubory. Takže tam je šest dost společné základní ones že budeme mluvit o dnes. fopen a jeho společník Funkce fclose, fgetc a jeho funkce společník fputc, a fread a jeho společník funkce, fwrite. Tak pojďme přímo do ní. fopen-- co to dělá? No, to otevře soubor, a to vám dává ukazatel souboru na to, takže pak můžete použít, že soubor ukazatel jako argument na některou z druhého souboru I / O funkce. Nejdůležitější věc pamatovat si s fopen je, že poté, co jste otevřel souboru nebo kamsi zavolal, jako je ta tady, je třeba zkontrolovat, aby se ujistil že ukazatel, že jste se vrátili se nerovná null. Pokud jste sledovali video na ukazatele, mohlo by to nedávalo smysl. Ale pokud se pokusíte a dereference nulový ukazatel odvolání, váš program bude pravděpodobně trpět segmentace [neslyšitelných]. Chceme, aby se ujistil, že jsme dostal legitimní ukazatel záda. Drtivá většina času budeme se dostali legitimní ukazatel zpět a to nebude problém. Tak jak to uděláme volání fopen? Vypadá to skoro jako je tento. Soubor hvězda ptr-- PTR být obecný jméno pro soubor pointer-- fopen a míjíme dvě věci, název souboru a operace chceme podniknout. Takže bychom mohli mít hovor, který vypadá jako tohle-- soubor hvězda ptr 1 rovná fopen file1.txt. A operace jsem zvolil, je r. Takže to, co si myslíte, že r je tady? Jaké jsou druhy věcí, které jsme mohl udělat, aby soubory? Takže r je operace, která jsme zvolit, kdy chceme číst soubor. Takže bychom v podstatě, když jsme volat takhle se dostat sami ukazatel souboru taková, že bychom mohli číst informace od file1.txt. Stejně tak bychom mohli otevřít soubor 2.txt pro psaní a tak můžeme projít ptr2, Soubor ukazatel jsem tu vytvořil, jako argument pro jakoukoli funkci, která zapíše informace do souboru. A podobně jako psaní, je tu také možnost připojit, a. Rozdíl mezi psaní a připojením v tom, že když píšete do souboru, pokud uděláte volání fopen pro psaní a tento soubor již existuje, je to chystá přepsat celý soubor. Bude to začátek na samém začátku, odstranění veškeré informace že už tam je. Vzhledem k tomu, pokud jej otevřený pouze pro připojení, to půjde na konec souboru v případě, že je již v textu ho nebo informace v něm, a bude pak začít psaní odtamtud. Takže budete neztratily nic z Informace, které jste předtím. Ať už chcete psát nebo připojit druh závisí na situaci. Ale pravděpodobně budete vědět, co právo operace je, když přijde čas. Tak to je fopen. Co fclose? No, docela jednoduše, fclose právě přijímá ukazatel souboru. A jak se dalo očekávat, zavře tento soubor. A jakmile jsme uzavřeli soubor, nemůžeme provádět žádné další soubor I / O funkce, čtení nebo zápisu na tomto souboru. Musíme znovu otevřít soubor jindy, aby pokračovat v práci s to pomocí I / O-funkce. Takže fclose znamená, že jsme hotovi práci s tímto souborem. A všechno, co potřebujeme, je předat jméno ukazatel v souboru. Takže o pár posune před jsme fopened soubor 1 bod text pro čtení a jsme přiřadili, že soubor ukazatel na ptr1. Nyní jsme se rozhodli, že jsme provádí čtení z tohoto souboru. Nepotřebujeme dělat víc s ním. Můžeme jen fclose ptr1. A stejně, mohli bychom fclose ty ostatní. Dobře. Tak to je otevírání a zavírání. To jsou dva základní zahájení operace. Teď chceme skutečně udělat nějaké zajímavé věci, a první funkce, že budeme vidět, že to udělá, je fgetc-- podat si charakter. To je to, co obvykle fgetc by se promítají do. Jeho životním cílem je přečíst následující znak, nebo je-li to vaše velmi První volání fgetc pro určitý soubor, první znak. Ale pak po tom, dostanete další, hned další charakter tohoto souboru, a ukládá ji do proměnné znak. Jak jsme tu udělali, char ch rovná fgetc, projít ve jménu ukazatel v souboru. Opět platí, že je to velmi zde důležité mít na paměti, že za účelem provedení tato operace úspěšná, Soubor ukazatel sám musel byl otevřen pro čtení. Nemůžeme číst znak ze souboru ukazatel, který jsme otevřeli pro zápis. Takže to je jedna z omezení fopen, že jo? Musíme omezit abychom se pouze provádění jedna operace s jedním ukazatel v souboru. Pokud bychom chtěli číst a napsat ze stejného souboru, budeme mít otevřené dva samostatné ukazatele soubor do stejné file-- jeden pro čtení, jeden pro psaní. Takže znovu, jediný důvod, proč Uvedu, že se nyní je protože pokud budeme volat na fgetc, že ​​ukazatel souboru muselo byl otevřen pro čtení. A pak docela jednoduše, vše, co potřebujete udělat, je projít v názvu ukazatel v souboru. Takže char ch rovná fgetc ptr1. To bude, abychom se dostali další character-- nebo znovu, pokud se jedná o první Tentokrát jsme udělali tuto výzvu, první character-- jakéhokoli soubor odkazuje ptr1. Připomeňme si, že to byl soubor 1 bod textu. To bude mít první písmeno, které a my uložit jej do proměnné ch. Docela jednoduché. A tak jsme se jen podíval na tři funkce a už jsme může něco docela čistý. Takže pokud vezmeme tuto schopnost dostat znak a my smyčka to-- tak jsme nadále dostávat znaky ze souboru znovu a nad a over-- teď jsme může číst každý charakter souboru. A pokud budeme tisknout každý znak hned poté, co jsme si ho přečetli, jsme nyní číst ze souboru a tištěný jeho obsah na obrazovku. Jsme účinně zřetězený tento soubor na obrazovce. A to je to, co Linux příkaz cat dělá. Zadáte-li kočka v názvu souboru to, vytiskne celý obsah souboru v okně vašeho terminálu. A tak tato malá smyčka tady, pouze tři řádky kódu, ale účinně zdvojuje Linux příkaz cat. Tak tohle by mohlo syntaxe vypadat trochu divně, ale tady je to, co se tady děje. Zatímco ch rovná fgetc, ptr není rovná EOF--, že je to celé sousto, ale pojďme rozebrat to jen takže je jasné, na syntaxi. Já jsem to upevnil kvůli prostoru, i když je to trochu syntakticky ošidné. Takže tato část v zelené vpravo A teď, co to dělá? No, to je právě náš fgetc volání, že jo? Viděli jsme, že před. Je to získání jednoho znak ze souboru. Pak jsme se porovnat, že znak proti OSZ. EOF je zvláštní hodnota, která je definované v normě io.h, který je konec souboru charakteru. Takže v podstatě to, co se bude dít je tato smyčka bude číst znak, porovnat ji s EOF se Konec souboru charakteru. Pokud se neshodují, takže nemáme došel na konec souboru, budeme tisknout tu postavu ven. Pak se vrátíme do začátek smyčky znovu. Dostaneme charakter, zkontrolujte proti OSZ, vytisknout, a tak dále a tak dále, a tak dále, opakování prostřednictvím tímto způsobem až jsme došli na konec souboru. A pak se tím bodem, budeme mít vytištěn out celého obsahu spisu. Takže znovu, jsme viděli jen fopen, fclose, a fgetc a už můžeme duplikovat terminální příkaz Linux. Jak jsem řekl na začátku, měli jsme fgetc a fputc, a fputc byl společníkem funkce fgetc. A tak, jak byste si mohli představit, to je ekvivalent psaní. To nám umožňuje napsat jeden znak do souboru. Opět platí, že je námitka, jen jako by to bylo s fgetc, soubor že jsme písemně musel být otevřít pro zápis nebo pouze pro připojení. Pokud se budeme snažit a používat fputc na soubor že jsme otevřen pro čtení, budeme trpět trochu omylem. Ale volání je velmi jednoduchý. fputc kapitálu ptr2, všechny že to bude dělat, je, že je to chystá napsat dopis do A do souboru 2 tečkou text, což bylo jméno toho soubor, který jsme otevřeli a přidělen ukazatel na ptr2. Takže budeme napsat kapitál od A do souboru 2 dot text. A budeme psát výkřik poukazují na souboru 3 tečka text, který byl na který ukazuje ptr3. Takže znovu, tady docela jednoduché. Ale teď můžeme dělat něco jiného. Máme tento příklad jsme prostě jít přes o schopnosti replikovat kočku Linux příkaz, ten, který vytiskne na obrazovku. No, teď, že máme schopnost číst znaky ze souborů a psát znaky do souborů, proč ne my prostě nahradit, že zavolat do printf s voláním fputc. A teď jsme duplicitní cp, velmi základní příkaz Linux že jsme mluvili o způsob, jak dlouho Před v Linuxu příkazy videa. Máme skutečně jsem duplikovány, že právě zde. Jsme čtení postavu a pak jsme psaní, že znak jiného souboru. Čtení z jednoho souboru, psaní do druhého, znovu a znovu a znovu, dokud jsme narazili EOF. Musíme se na konci soubor se snažíme kopírovat. A tím, že budeme mít napsáno postav musíme souboru že jsme písemně. Tak tohle je cp, příkaz Linux kopírování. Na samém počátku toto video, měl jsem námitku že bychom mluvit Něco málo o ukazatele. Zde se konkrétně, kde jsme mluvit o ukazatele kromě souboru ukazatele. Takže tato funkce vypadá děsivě. Má to několik parametrů. Je tu spousta děje. Je tu mnoho různých barvy a texty. Ale vážně, je to jen generické verze fgetc který nám umožňuje dostat nějakou množství informací. To může být trochu neefektivní když jsme dostat znaků jeden po druhém, iterace souboru jeden znak najednou. Nebylo by to být hezčí se dostat 100 v době, nebo 500 v době? No, fread a jeho společník funkce fwrite, který budeme mluvit o tom, V druhé, nám umožňují dělat jen to. Můžeme přečíst libovolnou částku informací z souboru a uložíme ho někde dočasně. Místo toho, že se může jen vešel v jedné proměnné, bychom mohli potřebovat uložit jej do pole. A tak jsme se projít ve čtyřech argumenty fread-- ukazatel na místo, kam máme se k ukládání informací, jak velké jsou jednotlivé informační jednotkou bude, kolik jednotek informací chceme získat, a od který soubor chceme dostat. Pravděpodobně nejlépe dokládá s příkladem zde. Takže řekněme, že prohlašujeme Pole 10 celých čísel. Právě jsme deklaroval na stack libovolně int arr 10. Tak to je docela jednoduché. To, co děláme, ale nyní je frecall se budeme velikost int čtení krát 10 bajtů informací. Velikost int bytí four-- to je velikost celé číslo v C. Takže to, co děláme je, že čtete 40 bytů v hodnotě informací ze souboru, na který ukazuje PTR. A my jsme ti, skladování 40 bytů někde kde jsme odložili 40 bytů v hodnotě paměti. Naštěstí jsme již učinili, že deklarovat arr, že pole tam. To je vhodné pro uchovávání 10 čtyřbytové jednotky. Takže celkem, to může držet 40 bytů v hodnotě informací. A my jsme právě čtete 40 bajtů informací ze spisu, a my ukládání do arr. Připomeňme z videa na ukazatele, které jméno pole, jako je například arr, je opravdu jen ukazatel k jeho prvnímu prvku. Takže když jsme se projít v arr tam, jsme se jsou ve skutečnosti, předáním ukazatel. Podobně můžeme udělat tohle-- my ne nutně je třeba zachránit naše vyrovnávací paměti v zásobníku. Také bychom mohli dynamicky přidělovat vyrovnávací paměť jako je tento, pomocí malloc. Pamatujte si, že když jsme se dynamicky alokovat paměť, jsme jeho uložení na haldy, nikoli zásobník. Ale je to pořád vyrovnávací paměti. Stále, v tomto případě je držení 640 bajtů informací protože double zabírá osm bajtů. A žádáme pro 80 z nich. Chceme mít prostor držet 80 dvoulůžkových pokojů. Tak 80 krát 8 640 bajtů informace. A to je výzva k fread sbírání 640 bajtů informací ze souboru, na který ukazuje PTR a ukládání nyní v arr2. Nyní můžeme léčit fread stejně jako volání fgetc. V tomto případě, my jsme jen se snaží získat jeden znak ze souboru. A my nepotřebují array držet znak. Můžeme jen uložit jej do variabilní znak. Úlovek, však je, že když jsme prostě proměnnou, musíme projít v Adresa této proměnné Připomeňme si, že proto, První argument fread je ukazatel na umístění a paměti kde chceme uložit informace. Opět platí, že na jméno pole je ukazatel. Takže nepotřebujeme dělat ampersand pole. Ale c, charakter c tady, není polem. Je to jen variabilní. A proto je třeba složit ampersand c uvést že to je adresa, kde chceme uložit tento jeden bajt informací, to jeden znak, který jsme sběr z PTR. Fwrite-- Projdu to trochu víc quickly-- je skoro přesný ekvivalent fread s výjimkou, že je to pro psaní místo čtení, jen stejně jako other-- jsme měli otevřeno V blízkosti, si postavu, napsat znak. Teď je to dostat libovolná Množství informací, právo libovolné množství informací. Takže stejně jako předtím, můžeme mají celou řadu 10 celých čísel kde už máme Informace uložené, snad. To bylo pravděpodobně několik řádků kódu že by měl jít mezi těmito dvěma kde jsem naplnit arr se něco smysluplného. I naplňte ji 10 různých čísel. A místo toho, co já jsem dělá píše z arr a shromažďování informací od arr. A beru, že informace a uvedení do souboru. Takže místo toho by bylo z soubor do vyrovnávací paměti, Nyní se z vyrovnávací paměti do souboru. Takže je to právě naopak. Takže znovu, stejně jako předtím, můžeme mají také haldy kus paměti že máme dynamicky přidělené a číst z toho a píší, že do souboru. A máme také jednu proměnnou schopna pojmout jeden bajt informací, jako je charakter. Ale opět, musíme předat adresa této proměnné když chceme číst z něj. Takže můžeme zapsat informace najdeme na této adrese na ukazatel v souboru, ptr. Je tu spousta jiné velký soubor I / O funkce že dělat různé věci kromě toho ty, které jsme mluvili o dnešku. Pár z těch, můžete najít užitečné jsou fgets a fputs, které jsou ekvivalentní z fgetc a fputc ale pro čtení jediný řetězec ze souboru. Místo toho, jeden znak, to bude číst celý řetězec. fprintf, který v zásadě umožňuje použít printf zapisovat do souboru. Takže stejně jako vy můžete udělat Substituce za proměnné s použitím Symboly procent i a procent d, a tak dále, s printf můžete podobně vzít printf řetězec a tisknout něco jako, že do souboru. fseek-- pokud máte DVD přehrávač je analogie I obvykle používají here-- je něco jako pomocí svého přetočit a rychle dopředu tlačítka pro pohyb po filmu. Podobně můžete pohybovat po souboru. Jednou z věcí, uvnitř že struktura souboru že c vytváří pro vás je indikátor kde jste v souboru. Vy jste u velmi začátek, v byte nulové? Jste na bajtu 100, byte 1000, a tak dále? Můžete použít fseek libovolně pohybovat že ukazatel dopředu nebo dozadu. A ftell, znovu podobně jako DVD přehrávače, je jako malý hodiny, které říká, vy, kolik minut a sekund jsou do určitého filmu. Stejně tak, jak vám řekne ftell mnoho bajtů jste do souboru. feof je jiná verze detekce Ať už jste došel na konec souboru. A ferror je funkce které můžete použít zjistit, zda má něco pokazilo práci se souborem. Znovu, toto je jen poškrábání povrchu. Je tu ještě spousta dalších souborů I / O funkce ve standardním io.h. Ale to bude pravděpodobně dostanete začal pracovat s ukazateli souborů. Jsem Doug Lloyd. To je cs50.