1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Soubor I / O] 2 00:00:02,000 --> 00:00:04,000 [Jason Hirschhorn, Harvard University] 3 00:00:04,000 --> 00:00:07,000 [To je CS50, CS50.TV] 4 00:00:07,000 --> 00:00:11,000 Když si myslíme, že soubor, co přijde na mysl, je dokument aplikace Microsoft Word, 5 00:00:11,000 --> 00:00:14,000 obrázek JPEG, nebo MP3 song, 6 00:00:14,000 --> 00:00:17,000 a jsme ve styku s každou z těchto typů souborů různými způsoby. 7 00:00:17,000 --> 00:00:20,000 Například, v dokumentu aplikace Word se přidat text 8 00:00:20,000 --> 00:00:24,000 zatímco u formátu JPEG můžeme odstřihnout hrany nebo retušovat barvy. 9 00:00:24,000 --> 00:00:28,000 Přesto pod kapotou všech souborů v našem počítači nejsou nic víc 10 00:00:28,000 --> 00:00:31,000 než dlouhé posloupnosti nul a jedniček. 11 00:00:31,000 --> 00:00:33,000 Je to na konkrétní aplikaci, která spolupracuje se souborem 12 00:00:33,000 --> 00:00:38,000 rozhodnout, jak zpracovat tento dlouhý sled a předloží jej pro uživatele. 13 00:00:38,000 --> 00:00:41,000 Na jedné straně, může dokument vypadat na jediném bajtu, 14 00:00:41,000 --> 00:00:45,000 nebo 8 nul a jedniček, a zobrazí ASCII znak na obrazovce. 15 00:00:45,000 --> 00:00:48,000 Na druhou stranu, může bitmapový obrázek podíváte na 3 byty, 16 00:00:48,000 --> 00:00:50,000 nebo 24 nul a jedniček, 17 00:00:50,000 --> 00:00:53,000 a interpretovat je jako 3 hexadecimálních čísel 18 00:00:53,000 --> 00:00:56,000 které představují hodnoty pro červenou, zelenou a modrou barvu 19 00:00:56,000 --> 00:00:58,000 v jednom pixel obrazu. 20 00:00:58,000 --> 00:01:01,000 Ať oni mohou vypadat jako na obrazovce, ve své podstatě, 21 00:01:01,000 --> 00:01:05,000 Soubory nejsou nic víc než sled nul a jedniček. 22 00:01:05,000 --> 00:01:08,000 Takže pojďme ponořit a podívat se na to, jak jsme vlastně manipulaci s těmito nul a jedniček 23 00:01:08,000 --> 00:01:12,000 pokud jde o psaní a čtení ze souboru. 24 00:01:12,000 --> 00:01:15,000 >> Začnu tím, že rozbije ho do jednoduchého 3-část procesu. 25 00:01:15,000 --> 00:01:19,000 Dále budu ponořit do dvou příkladech kódu, které ukazují tyto tři části. 26 00:01:19,000 --> 00:01:23,000 Nakonec, já přehodnotit proces a některé z jeho nejdůležitějších detailů. 27 00:01:23,000 --> 00:01:25,000 Stejně jako u jakéhokoli souboru, který sedí na ploše, 28 00:01:25,000 --> 00:01:28,000 první věc, kterou musíte udělat, je otevřít. 29 00:01:28,000 --> 00:01:31,000 V jazyce C jsme to tím, že deklaruje ukazatel na struct předem 30 00:01:31,000 --> 00:01:33,000 , který představuje soubor na disku. 31 00:01:33,000 --> 00:01:38,460 V tomto volání funkce, jsme také rozhodnout, zda chceme psát nebo číst ze souboru. 32 00:01:38,460 --> 00:01:41,660 Dále jsme dělat skutečné čtení a psaní. 33 00:01:41,660 --> 00:01:44,800 Existuje celá řada specializovaných funkcí se mohou použít v této části, 34 00:01:44,800 --> 00:01:48,790 a téměř všichni z nich začít s písmenem F, což je zkratka pro soubor. 35 00:01:48,790 --> 00:01:53,560 Poslední, podobný na malé červené X v horním rohu souborů otevřít na vašem počítači, 36 00:01:53,560 --> 00:01:56,680 zavřeme soubor s konečnou volání funkce. 37 00:01:56,680 --> 00:01:59,540 Nyní, když máme obecnou představu o tom, co budeme dělat, 38 00:01:59,540 --> 00:02:02,000 Pojďme se ponořit do kódu. 39 00:02:02,000 --> 00:02:06,100 >> V tomto adresáři, máme dvě C soubory a jejich odpovídající spustitelné soubory. 40 00:02:06,100 --> 00:02:09,710 Psací stroj Program trvá jeden argument příkazového řádku, 41 00:02:09,710 --> 00:02:12,060 název dokumentu chceme vytvořit. 42 00:02:12,060 --> 00:02:16,160 V tomto případě, budeme nazývat Doc.txt. 43 00:02:16,160 --> 00:02:19,080 Pojďme spustit program a zadat pár řádků. 44 00:02:19,080 --> 00:02:23,660 Ahoj. Mé jméno je Jason. 45 00:02:23,660 --> 00:02:26,710 Nakonec, budeme psát "quit". 46 00:02:26,710 --> 00:02:29,720 Pokud bychom nyní vypsat všechny soubory v tomto adresáři, 47 00:02:29,720 --> 00:02:33,770 vidíme, že nový dokument existuje tzv. Doc.txt. 48 00:02:34,190 --> 00:02:36,110 To je soubor tohoto programu právě vytvořili. 49 00:02:36,110 --> 00:02:40,520 A samozřejmě, je rovněž nic víc, než dlouhé posloupnosti nul a jedniček. 50 00:02:41,100 --> 00:02:43,260 Pokud jsme se otevřít tento nový soubor, 51 00:02:43,260 --> 00:02:45,870 vidíme 3 řádky kódu jsme vstoupili do našeho programu - 52 00:02:46,060 --> 00:02:49,060 Ahoj. May jméno je Jason. 53 00:02:49,580 --> 00:02:52,090 Ale co se vlastně děje, když typewriter.c běží? 54 00:02:52,810 --> 00:02:55,520 První řádek zájmu je pro nás linka 24. 55 00:02:55,560 --> 00:02:58,490 V tomto řádku, prohlašujeme, že náš soubor ukazatel. 56 00:02:59,080 --> 00:03:03,140 Funkce, která vrací tento ukazatel, fopen, vyžaduje dva argumenty. 57 00:03:03,140 --> 00:03:07,440 První je název souboru včetně přípony souboru v případě potřeby. 58 00:03:07,440 --> 00:03:10,980 Připomeňme si, že přípona neovlivňuje soubor na nejnižší úrovni. 59 00:03:10,980 --> 00:03:14,640 Jsme vždy řešení s dlouhou sekvenci nul a jedniček. 60 00:03:14,640 --> 00:03:19,630 Ale to přece vliv, jak jsou soubory interpretovány a jaké aplikace jsou používány k otevření je. 61 00:03:19,630 --> 00:03:22,290 Druhý argument funkce fopen je jedno písmeno 62 00:03:22,290 --> 00:03:25,300 , které stojí za to, co chceme dělat, když jsme otevření souboru. 63 00:03:25,300 --> 00:03:30,630 Existují tři možnosti pro tento argument - W, R, a A. 64 00:03:30,630 --> 00:03:34,900 Vybrali jsme w v tomto případě, protože chceme zapisovat do souboru. 65 00:03:34,900 --> 00:03:38,820 R, jak asi tušíte, je pro čtení souboru. 66 00:03:38,820 --> 00:03:41,760 A je pro přidání do souboru. 67 00:03:41,760 --> 00:03:44,960 I když jak w a mohou být použity pro zápis do souborů, 68 00:03:44,960 --> 00:03:47,460 w začíná od začátku souboru 69 00:03:47,460 --> 00:03:50,810 a potenciálně přepsat veškerá data, které byly dříve uloženy. 70 00:03:50,810 --> 00:03:54,070 Ve výchozím nastavení je soubor otevíráme, pokud již neexistuje, 71 00:03:54,070 --> 00:03:57,180 je vytvořen v našem současném pracovním adresáři. 72 00:03:57,180 --> 00:04:00,540 Nicméně, chceme-li získat přístup, nebo vytvořit soubor v jiném místě, 73 00:04:00,540 --> 00:04:02,650 v prvním argumentu fopen, 74 00:04:02,650 --> 00:04:05,840 můžeme zadat cestu k souboru kromě názvu souboru. 75 00:04:05,840 --> 00:04:09,490 Zatímco první část tohoto procesu je pouze jeden řádek kódu dlouhé, 76 00:04:09,490 --> 00:04:12,350 je to vždy dobré praxe o další sadu čar 77 00:04:12,350 --> 00:04:15,930 že přesvědčte se, že soubor byl úspěšně otevřen nebo vytvořen. 78 00:04:15,930 --> 00:04:20,300 Pokud fopen vrátí null, bychom nechtěli vpřed s naším programem, 79 00:04:20,300 --> 00:04:23,270 ak tomu může dojít v případě, že operační systém je z paměti 80 00:04:23,270 --> 00:04:27,940 nebo pokud se pokusíte otevřít soubor v adresáři, pro které jsme neměli příslušná oprávnění. 81 00:04:27,940 --> 00:04:31,780 >> Druhá část procesu probíhá v psacího stroje, zatímco smyčky. 82 00:04:31,780 --> 00:04:35,000 Používáme CS50 knihovny funkci získat vstup od uživatele, 83 00:04:35,000 --> 00:04:37,190 a za předpokladu, že nechtějí opustit program, 84 00:04:37,190 --> 00:04:41,940 jsme použít funkci fputs, aby řetězec a zapíše je do souboru. 85 00:04:41,940 --> 00:04:46,700 fputs je pouze jedním z mnoha funkcí bychom mohli použít k zápisu do souboru. 86 00:04:46,700 --> 00:04:51,920 Jiní zahrnují fwrite, fputc, a dokonce i fprintf. 87 00:04:51,920 --> 00:04:54,840 Bez ohledu na konkrétní funkci jsme skončit s použitím, i když, 88 00:04:54,840 --> 00:04:57,480 všechny z nich potřebujete vědět, prostřednictvím svých argumentů, 89 00:04:57,480 --> 00:04:59,670 alespoň dvě věci - 90 00:04:59,670 --> 00:05:03,140 co je třeba písemná a pokud je třeba zapisovat. 91 00:05:03,140 --> 00:05:07,240 V našem případě, vstup je řetězec, který musí být písemný 92 00:05:07,240 --> 00:05:11,290 a fp je ukazatel, který směruje nás k místu, kde jsme psát. 93 00:05:11,290 --> 00:05:15,330 V tomto programu, druhá část procesu je poměrně jednoduché. 94 00:05:15,330 --> 00:05:17,360 Jsme prostě vezme řetězec od uživatele 95 00:05:17,360 --> 00:05:22,120 a přidáním přímo do našeho souboru s málo-to-no ověřování vstupu nebo bezpečnostní kontroly. 96 00:05:22,120 --> 00:05:26,160 Často se však bude druhá část zabírají většinu kódu. 97 00:05:26,160 --> 00:05:30,580 Konečně, třetí část je on-line 58, kde jsme zavřete soubor. 98 00:05:30,580 --> 00:05:34,860 Zde říkáme fclose a předat ji náš původní soubor ukazatel. 99 00:05:34,860 --> 00:05:39,500 V následujícím lince, vrátí nulu, signalizující konec našeho programu. 100 00:05:39,500 --> 00:05:42,630 A, ano, třetí část je tak jednoduché. 101 00:05:42,630 --> 00:05:45,260 >> Pojďme ke čtení ze souborů. 102 00:05:45,260 --> 00:05:48,220 Zpět v našem adresáři máme soubor s názvem printer.c. 103 00:05:48,220 --> 00:05:50,910 Pojďme spustit se souborem jsme právě vytvořili - 104 00:05:50,910 --> 00:05:53,350 Doc.txt. 105 00:05:53,350 --> 00:05:58,150 Tento program, jak již název napovídá, bude jednoduše vytisknout z obsahu spisu předány. 106 00:05:58,150 --> 00:06:00,230 A tady to máme. 107 00:06:00,230 --> 00:06:03,780 Řádky kódu jsme psali dříve a uloženy v doc.txt. 108 00:06:03,780 --> 00:06:06,980 Ahoj. Mé jméno je Jason. 109 00:06:06,980 --> 00:06:09,120 Pokud se ponoříme do printer.c, 110 00:06:09,120 --> 00:06:13,570 vidíme, že mnoho kódu vypadá podobně jako to, co jsme právě prošli v typewriter.c. 111 00:06:13,570 --> 00:06:16,720 Opravdu řádek 22, kde jsme otevřeli soubor, 112 00:06:16,720 --> 00:06:19,220 a linka 39, kde jsme uzavřeli soubor, 113 00:06:19,220 --> 00:06:23,890 tak téměř totožné s typewriter.c, s výjimkou fopen druhý argument. 114 00:06:23,890 --> 00:06:26,510 Tentokrát jsme čtení ze souboru, 115 00:06:26,510 --> 00:06:29,040 takže jsme se rozhodli r místo w. 116 00:06:29,040 --> 00:06:31,950 Tak, zaměřme na druhé části procesu. 117 00:06:31,950 --> 00:06:36,060 V potrubí 35, jako druhý stav v našem 4 smyčce, 118 00:06:36,060 --> 00:06:38,590 jsme-li volat do fgets, 119 00:06:38,590 --> 00:06:42,190 společník funkci fputs z před. 120 00:06:42,190 --> 00:06:44,660 Tentokrát máme tři argumenty. 121 00:06:44,660 --> 00:06:48,810 Prvním z nich je ukazatel na pole znaků, kde řetězec bude uložena. 122 00:06:48,810 --> 00:06:52,670 Druhým je maximální počet znaků, které se číst. 123 00:06:52,670 --> 00:06:56,010 A třetí je ukazatel na soubor, se kterými pracujete. 124 00:06:56,010 --> 00:07:00,780 Určitě jste si všimli, že na smyčce končí, když fgets vrátí null. 125 00:07:00,780 --> 00:07:02,940 Existují dva důvodem, že toto může stát. 126 00:07:02,940 --> 00:07:05,380 Za prvé, může dojít k chybě. 127 00:07:05,380 --> 00:07:10,740 Za druhé, a větší pravděpodobnost, byl konec souboru dosáhla a ne více znaků byly čteny. 128 00:07:10,740 --> 00:07:14,040 V případě, že jste přemýšlel, dvě funkce existují, které nám umožní říci 129 00:07:14,040 --> 00:07:17,160 z tohoto důvodu je příčinou tohoto konkrétního null ukazatel. 130 00:07:17,160 --> 00:07:21,090 A není divu, protože mají co do činění s práci se soubory, 131 00:07:21,090 --> 00:07:26,940 jak fError funkce a funkce feof start s písmenem f. 132 00:07:26,940 --> 00:07:32,130 >> Konečně, před tím, než k závěru, jedna rychlá zmínka o konec souboru funkcí, 133 00:07:32,130 --> 00:07:36,690 která, jak bylo právě uvedeno, je psán jako feof. 134 00:07:36,690 --> 00:07:41,550 Často zjistíte, sami pomocí while a for smyčky postupně přečíst si cestu přes soubory. 135 00:07:41,550 --> 00:07:45,790 Tak, budete potřebovat způsob, jak ukončit tyto smyčky po dosažení konce těchto souborů. 136 00:07:45,790 --> 00:07:50,510 Volání feof na souborovém ukazatel a kontrola, zda je to pravda 137 00:07:50,510 --> 00:07:52,310 by dělat jen to. 138 00:07:52,310 --> 00:07:59,820 Tak může while s podmínkou (! Feof (fp)) jeví jako dokonale vhodného řešení. 139 00:07:59,820 --> 00:08:03,770 Nicméně, že máme jeden řádek vlevo v našem textovém souboru. 140 00:08:03,770 --> 00:08:07,130 Budeme vstoupí do našeho while a vše bude fungovat tak, jak bylo plánováno. 141 00:08:07,130 --> 00:08:12,750 Na dalším kole přes, bude náš program zkontroluje, zda feof FP je pravda, 142 00:08:12,750 --> 00:08:15,430 ale - a to je klíčový bod k pochopení zde - 143 00:08:15,430 --> 00:08:17,770 to nebude pravda zatím. 144 00:08:17,770 --> 00:08:21,110 To je proto, že cílem feof není kontrolovat 145 00:08:21,110 --> 00:08:24,400 v případě, že další volání o přečtení funkci bude hit konec souboru, 146 00:08:24,400 --> 00:08:28,190 , ale spíše ověřit, zda je či není konec souboru již bylo dosaženo. 147 00:08:28,190 --> 00:08:30,140 V případě tohoto příkladu, 148 00:08:30,140 --> 00:08:32,780 čtení poslední řádek našem souboru jde plynule, 149 00:08:32,780 --> 00:08:36,210 ale program ještě neví, že jsme narazila na konec našeho souboru. 150 00:08:36,210 --> 00:08:40,549 Není to až to dělá jednu dodatečnou četl že čítače konci souboru. 151 00:08:40,549 --> 00:08:43,210 Tak, správné podmínka je následující: 152 00:08:43,210 --> 00:08:49,330 fgets a jeho tři argumenty - výstup, velikost výstupu, a fp - 153 00:08:49,330 --> 00:08:52,570 a to vše není rovno null. 154 00:08:52,570 --> 00:08:55,260 Tento přístup je jsme se v printer.c, 155 00:08:55,260 --> 00:08:57,890 a v tomto případě se po smyčky východům, 156 00:08:57,890 --> 00:09:04,290 by se dalo nazvat feof nebo fError informovat uživatele, pokud jde o zvláštní argumentace pro ukončení této smyčky. 157 00:09:04,290 --> 00:09:08,100 >> Psaní a čtení ze souboru, je na jeho nejzákladnější, 158 00:09:08,100 --> 00:09:10,150 Jednoduchý 3-dílná proces. 159 00:09:10,150 --> 00:09:12,530 Za prvé, jsme se otevřít soubor. 160 00:09:12,530 --> 00:09:16,740 Za druhé, jsme dát nějaké věci do našeho souboru nebo se některé věci z něj. 161 00:09:16,740 --> 00:09:19,200 Zatřetí, zavřeme soubor. 162 00:09:19,200 --> 00:09:21,170 První a poslední části jsou snadné. 163 00:09:21,170 --> 00:09:23,920 Prostřední část je místo, kde choulostivé věci spočívá. 164 00:09:23,920 --> 00:09:27,760 A i když pod kapotou jsme vždy řešení s dlouhou sekvenci nul a jedniček, 165 00:09:27,760 --> 00:09:30,710 to pomůže při kódování přidat vrstvu abstrakce 166 00:09:30,710 --> 00:09:35,350 , který změní pořadí na něco, co více podobá, co jsme zvyklí vídat. 167 00:09:35,350 --> 00:09:39,570 Například, pokud budeme pracovat s 24-bitový bitmapový soubor, 168 00:09:39,570 --> 00:09:43,290 budeme pravděpodobně při čtení nebo zápisu tři bajty najednou. 169 00:09:43,290 --> 00:09:46,450 V takovém případě, by to smysl definovat a vhodně pojmenovat 170 00:09:46,450 --> 00:09:48,980 struct, který je 3 bajty velký. 171 00:09:48,980 --> 00:09:51,410 >> Ačkoli práce se soubory může zdát složité, 172 00:09:51,410 --> 00:09:54,530 využití je nám umožňuje udělat něco opravdu pozoruhodný. 173 00:09:54,530 --> 00:09:58,880 Můžeme změnit stav světa mimo naši programu, 174 00:09:58,880 --> 00:10:01,730 můžeme vytvořit něco, co žije mimo životě našeho programu, 175 00:10:01,730 --> 00:10:07,190 nebo můžeme dokonce něco změnit, která byla vytvořena před náš program rozběhl. 176 00:10:07,190 --> 00:10:11,210 Interakce se soubory je opravdu silný část programování v jazyce C. 177 00:10:11,210 --> 00:10:15,300 a já jsem nadšený, aby viděli, co budete vytvářet s ním v kódu, který přijde. 178 00:10:15,300 --> 00:10:19,770 Mé jméno je Jason Hirschhorn. To je CS50. 179 00:10:19,770 --> 00:10:21,770 [CS50.TV] 180 00:10:21,770 --> 00:10:25,940 >> [Smích] 181 00:10:25,940 --> 00:10:29,330 Dobře. Jedna se. Jdeme na to. 182 00:10:49,000 --> 00:10:52,140 Když si myslíme, že souboru - >> Oh, počkat. Promiňte. 183 00:10:52,140 --> 00:10:56,800 [Smích] Tak. 184 00:11:06,620 --> 00:11:09,970 Hey there. 185 00:11:13,670 --> 00:11:16,310 Když si myslíme, že souboru - 186 00:11:17,610 --> 00:11:20,710 Pokud si myslíte, že o souboru - Dobře. Řekni mi, až budeš připravená. 187 00:11:20,710 --> 00:11:22,520 Oh, skvělé. 188 00:11:22,520 --> 00:11:26,180 Ačkoli čtení z teleprompter může zdát - no. Moje chyba.