[Powered by Google Translate] [Soubor I / O] [Jason Hirschhorn, Harvard University] [To je CS50, CS50.TV] Když si myslíme, že soubor, co přijde na mysl, je dokument aplikace Microsoft Word, obrázek JPEG, nebo MP3 song, a jsme ve styku s každou z těchto typů souborů různými způsoby. Například, v dokumentu aplikace Word se přidat text zatímco u formátu JPEG můžeme odstřihnout hrany nebo retušovat barvy. Přesto pod kapotou všech souborů v našem počítači nejsou nic víc než dlouhé posloupnosti nul a jedniček. Je to na konkrétní aplikaci, která spolupracuje se souborem rozhodnout, jak zpracovat tento dlouhý sled a předloží jej pro uživatele. Na jedné straně, může dokument vypadat na jediném bajtu, nebo 8 nul a jedniček, a zobrazí ASCII znak na obrazovce. Na druhou stranu, může bitmapový obrázek podíváte na 3 byty, nebo 24 nul a jedniček, a interpretovat je jako 3 hexadecimálních čísel které představují hodnoty pro červenou, zelenou a modrou barvu v jednom pixel obrazu. Ať oni mohou vypadat jako na obrazovce, ve své podstatě, Soubory nejsou nic víc než sled nul a jedniček. Takže pojďme ponořit a podívat se na to, jak jsme vlastně manipulaci s těmito nul a jedniček pokud jde o psaní a čtení ze souboru. Začnu tím, že rozbije ho do jednoduchého 3-část procesu. Dále budu ponořit do dvou příkladech kódu, které ukazují tyto tři části. Nakonec, já přehodnotit proces a některé z jeho nejdůležitějších detailů. Stejně jako u jakéhokoli souboru, který sedí na ploše, první věc, kterou musíte udělat, je otevřít. V jazyce C jsme to tím, že deklaruje ukazatel na struct předem , který představuje soubor na disku. V tomto volání funkce, jsme také rozhodnout, zda chceme psát nebo číst ze souboru. Dále jsme dělat skutečné čtení a psaní. Existuje celá řada specializovaných funkcí se mohou použít v této části, a téměř všichni z nich začít s písmenem F, což je zkratka pro soubor. Poslední, podobný na malé červené X v horním rohu souborů otevřít na vašem počítači, zavřeme soubor s konečnou volání funkce. Nyní, když máme obecnou představu o tom, co budeme dělat, Pojďme se ponořit do kódu. V tomto adresáři, máme dvě C soubory a jejich odpovídající spustitelné soubory. Psací stroj Program trvá jeden argument příkazového řádku, název dokumentu chceme vytvořit. V tomto případě, budeme nazývat Doc.txt. Pojďme spustit program a zadat pár řádků. Ahoj. Mé jméno je Jason. Nakonec, budeme psát "quit". Pokud bychom nyní vypsat všechny soubory v tomto adresáři, vidíme, že nový dokument existuje tzv. Doc.txt. To je soubor tohoto programu právě vytvořili. A samozřejmě, je rovněž nic víc, než dlouhé posloupnosti nul a jedniček. Pokud jsme se otevřít tento nový soubor, vidíme 3 řádky kódu jsme vstoupili do našeho programu - Ahoj. May jméno je Jason. Ale co se vlastně děje, když typewriter.c běží? První řádek zájmu je pro nás linka 24. V tomto řádku, prohlašujeme, že náš soubor ukazatel. Funkce, která vrací tento ukazatel, fopen, vyžaduje dva argumenty. První je název souboru včetně přípony souboru v případě potřeby. Připomeňme si, že přípona neovlivňuje soubor na nejnižší úrovni. Jsme vždy řešení s dlouhou sekvenci nul a jedniček. Ale to přece vliv, jak jsou soubory interpretovány a jaké aplikace jsou používány k otevření je. Druhý argument funkce fopen je jedno písmeno , které stojí za to, co chceme dělat, když jsme otevření souboru. Existují tři možnosti pro tento argument - W, R, a A. Vybrali jsme w v tomto případě, protože chceme zapisovat do souboru. R, jak asi tušíte, je pro čtení souboru. A je pro přidání do souboru. I když jak w a mohou být použity pro zápis do souborů, w začíná od začátku souboru a potenciálně přepsat veškerá data, které byly dříve uloženy. Ve výchozím nastavení je soubor otevíráme, pokud již neexistuje, je vytvořen v našem současném pracovním adresáři. Nicméně, chceme-li získat přístup, nebo vytvořit soubor v jiném místě, v prvním argumentu fopen, můžeme zadat cestu k souboru kromě názvu souboru. Zatímco první část tohoto procesu je pouze jeden řádek kódu dlouhé, je to vždy dobré praxe o další sadu čar že přesvědčte se, že soubor byl úspěšně otevřen nebo vytvořen. Pokud fopen vrátí null, bychom nechtěli vpřed s naším programem, ak tomu může dojít v případě, že operační systém je z paměti nebo pokud se pokusíte otevřít soubor v adresáři, pro které jsme neměli příslušná oprávnění. Druhá část procesu probíhá v psacího stroje, zatímco smyčky. Používáme CS50 knihovny funkci získat vstup od uživatele, a za předpokladu, že nechtějí opustit program, jsme použít funkci fputs, aby řetězec a zapíše je do souboru. fputs je pouze jedním z mnoha funkcí bychom mohli použít k zápisu do souboru. Jiní zahrnují fwrite, fputc, a dokonce i fprintf. Bez ohledu na konkrétní funkci jsme skončit s použitím, i když, všechny z nich potřebujete vědět, prostřednictvím svých argumentů, alespoň dvě věci - co je třeba písemná a pokud je třeba zapisovat. V našem případě, vstup je řetězec, který musí být písemný a fp je ukazatel, který směruje nás k místu, kde jsme psát. V tomto programu, druhá část procesu je poměrně jednoduché. Jsme prostě vezme řetězec od uživatele a přidáním přímo do našeho souboru s málo-to-no ověřování vstupu nebo bezpečnostní kontroly. Často se však bude druhá část zabírají většinu kódu. Konečně, třetí část je on-line 58, kde jsme zavřete soubor. Zde říkáme fclose a předat ji náš původní soubor ukazatel. V následujícím lince, vrátí nulu, signalizující konec našeho programu. A, ano, třetí část je tak jednoduché. Pojďme ke čtení ze souborů. Zpět v našem adresáři máme soubor s názvem printer.c. Pojďme spustit se souborem jsme právě vytvořili - Doc.txt. Tento program, jak již název napovídá, bude jednoduše vytisknout z obsahu spisu předány. A tady to máme. Řádky kódu jsme psali dříve a uloženy v doc.txt. Ahoj. Mé jméno je Jason. Pokud se ponoříme do printer.c, vidíme, že mnoho kódu vypadá podobně jako to, co jsme právě prošli v typewriter.c. Opravdu řádek 22, kde jsme otevřeli soubor, a linka 39, kde jsme uzavřeli soubor, tak téměř totožné s typewriter.c, s výjimkou fopen druhý argument. Tentokrát jsme čtení ze souboru, takže jsme se rozhodli r místo w. Tak, zaměřme na druhé části procesu. V potrubí 35, jako druhý stav v našem 4 smyčce, jsme-li volat do fgets, společník funkci fputs z před. Tentokrát máme tři argumenty. Prvním z nich je ukazatel na pole znaků, kde řetězec bude uložena. Druhým je maximální počet znaků, které se číst. A třetí je ukazatel na soubor, se kterými pracujete. Určitě jste si všimli, že na smyčce končí, když fgets vrátí null. Existují dva důvodem, že toto může stát. Za prvé, může dojít k chybě. Za druhé, a větší pravděpodobnost, byl konec souboru dosáhla a ne více znaků byly čteny. V případě, že jste přemýšlel, dvě funkce existují, které nám umožní říci z tohoto důvodu je příčinou tohoto konkrétního null ukazatel. A není divu, protože mají co do činění s práci se soubory, jak fError funkce a funkce feof start s písmenem f. Konečně, před tím, než k závěru, jedna rychlá zmínka o konec souboru funkcí, která, jak bylo právě uvedeno, je psán jako feof. Často zjistíte, sami pomocí while a for smyčky postupně přečíst si cestu přes soubory. Tak, budete potřebovat způsob, jak ukončit tyto smyčky po dosažení konce těchto souborů. Volání feof na souborovém ukazatel a kontrola, zda je to pravda by dělat jen to. Tak může while s podmínkou (! Feof (fp)) jeví jako dokonale vhodného řešení. Nicméně, že máme jeden řádek vlevo v našem textovém souboru. Budeme vstoupí do našeho while a vše bude fungovat tak, jak bylo plánováno. Na dalším kole přes, bude náš program zkontroluje, zda feof FP je pravda, ale - a to je klíčový bod k pochopení zde - to nebude pravda zatím. To je proto, že cílem feof není kontrolovat v případě, že další volání o přečtení funkci bude hit konec souboru, , ale spíše ověřit, zda je či není konec souboru již bylo dosaženo. V případě tohoto příkladu, čtení poslední řádek našem souboru jde plynule, ale program ještě neví, že jsme narazila na konec našeho souboru. Není to až to dělá jednu dodatečnou četl že čítače konci souboru. Tak, správné podmínka je následující: fgets a jeho tři argumenty - výstup, velikost výstupu, a fp - a to vše není rovno null. Tento přístup je jsme se v printer.c, a v tomto případě se po smyčky východům, by se dalo nazvat feof nebo fError informovat uživatele, pokud jde o zvláštní argumentace pro ukončení této smyčky. Psaní a čtení ze souboru, je na jeho nejzákladnější, Jednoduchý 3-dílná proces. Za prvé, jsme se otevřít soubor. Za druhé, jsme dát nějaké věci do našeho souboru nebo se některé věci z něj. Zatřetí, zavřeme soubor. První a poslední části jsou snadné. Prostřední část je místo, kde choulostivé věci spočívá. A i když pod kapotou jsme vždy řešení s dlouhou sekvenci nul a jedniček, to pomůže při kódování přidat vrstvu abstrakce , který změní pořadí na něco, co více podobá, co jsme zvyklí vídat. Například, pokud budeme pracovat s 24-bitový bitmapový soubor, budeme pravděpodobně při čtení nebo zápisu tři bajty najednou. V takovém případě, by to smysl definovat a vhodně pojmenovat struct, který je 3 bajty velký. Ačkoli práce se soubory může zdát složité, využití je nám umožňuje udělat něco opravdu pozoruhodný. Můžeme změnit stav světa mimo naši programu, můžeme vytvořit něco, co žije mimo životě našeho programu, nebo můžeme dokonce něco změnit, která byla vytvořena před náš program rozběhl. Interakce se soubory je opravdu silný část programování v jazyce C. a já jsem nadšený, aby viděli, co budete vytvářet s ním v kódu, který přijde. Mé jméno je Jason Hirschhorn. To je CS50. [CS50.TV] [Smích] Dobře. Jedna se. Jdeme na to. Když si myslíme, že souboru - >> Oh, počkat. Promiňte. [Smích] Tak. Hey there. Když si myslíme, že souboru - Pokud si myslíte, že o souboru - Dobře. Řekni mi, až budeš připravená. Oh, skvělé. Ačkoli čtení z teleprompter může zdát - no. Moje chyba.