1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Súbor 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 Keď si myslíme, že o súbore, čo príde na myseľ, je dokument programu Microsoft Word, 5 00:00:11,000 --> 00:00:14,000 obrázok JPEG, alebo MP3 song, 6 00:00:14,000 --> 00:00:17,000 a sme v kontakte s každou z týchto typov súborov rôznymi spôsobmi. 7 00:00:17,000 --> 00:00:20,000 Napríklad, v dokumente programu Word sa pridať text 8 00:00:20,000 --> 00:00:24,000 zatiaľ čo pri formáte JPEG môžeme odstrihnúť hrany alebo retušovať farby. 9 00:00:24,000 --> 00:00:28,000 Napriek tomu pod kapotou všetkých súborov v našom počítači nie sú nič viac 10 00:00:28,000 --> 00:00:31,000 ako dlhé postupnosti núl a jedničiek. 11 00:00:31,000 --> 00:00:33,000 Je to na konkrétnu aplikáciu, ktorá spolupracuje so súborom 12 00:00:33,000 --> 00:00:38,000 rozhodnúť, ako spracovať tento dlhý sled a predloží ho pre užívateľa. 13 00:00:38,000 --> 00:00:41,000 Na jednej strane, môže dokument vyzerať na jedinom bajtu, 14 00:00:41,000 --> 00:00:45,000 alebo 8 núl a jedničiek, a zobrazí ASCII znak na obrazovke. 15 00:00:45,000 --> 00:00:48,000 Na druhej strane, môže byť rastrový obrázok sa na 3 bajty, 16 00:00:48,000 --> 00:00:50,000 alebo 24 núl a jedničiek, 17 00:00:50,000 --> 00:00:53,000 a interpretovať ich ako 3 hexadecimálnych čísel 18 00:00:53,000 --> 00:00:56,000 ktoré predstavujú hodnoty pre červenú, zelenú a modrú farbu 19 00:00:56,000 --> 00:00:58,000 v jednom pixel obrazu. 20 00:00:58,000 --> 00:01:01,000 Nech oni môžu vyzerať ako na obrazovke, vo svojej podstate, 21 00:01:01,000 --> 00:01:05,000 Súbory nie sú nič viac ako sled núl a jedničiek. 22 00:01:05,000 --> 00:01:08,000 Takže poďme ponoriť a pozrieť sa na to, ako sme vlastne manipulácii s týmito núl a jedničiek 23 00:01:08,000 --> 00:01:12,000 pokiaľ ide o písanie a čítanie zo súboru. 24 00:01:12,000 --> 00:01:15,000 >> Začnem tým, že rozbije ho do jednoduchého 3-časť procesu. 25 00:01:15,000 --> 00:01:19,000 Ďalej budem ponoriť do dvoch príkladoch kódu, ktoré ukazujú tieto tri časti. 26 00:01:19,000 --> 00:01:23,000 Nakoniec, ja prehodnotiť proces a niektoré z jeho najdôležitejších detailov. 27 00:01:23,000 --> 00:01:25,000 Rovnako ako u akéhokoľvek súboru, ktorý sedí na ploche, 28 00:01:25,000 --> 00:01:28,000 Prvá vec, ktorú musíte urobiť, je otvoriť. 29 00:01:28,000 --> 00:01:31,000 V jazyku C sme to tým, že deklaruje ukazovateľ na struct vopred 30 00:01:31,000 --> 00:01:33,000 , Ktorý predstavuje súbor na disku. 31 00:01:33,000 --> 00:01:38,460 V tomto volanie funkcie, sme tiež rozhodnúť, či chceme písať alebo čítať zo súboru. 32 00:01:38,460 --> 00:01:41,660 Ďalej sme robiť skutočné čítanie a písanie. 33 00:01:41,660 --> 00:01:44,800 Existuje celý rad špecializovaných funkcií sa môžu použiť v tejto časti, 34 00:01:44,800 --> 00:01:48,790 a takmer všetci z nich začať s písmenom F, čo je skratka pre súbor. 35 00:01:48,790 --> 00:01:53,560 Posledná, podobný na malé červené X v hornom rohu súborov otvoriť na vašom počítači, 36 00:01:53,560 --> 00:01:56,680 zavrieme súbor s konečnou volanie funkcie. 37 00:01:56,680 --> 00:01:59,540 Teraz, keď máme všeobecnú predstavu o tom, čo budeme robiť, 38 00:01:59,540 --> 00:02:02,000 Poďme sa ponoriť do kódu. 39 00:02:02,000 --> 00:02:06,100 >> V tomto adresári, máme dve C súbory a ich zodpovedajúce spustiteľné súbory. 40 00:02:06,100 --> 00:02:09,710 Písací stroj Program trvá jeden argument príkazového riadku, 41 00:02:09,710 --> 00:02:12,060 názov dokumentu chceme vytvoriť. 42 00:02:12,060 --> 00:02:16,160 V tomto prípade, budeme nazývať Doc.txt. 43 00:02:16,160 --> 00:02:19,080 Poďme spustiť program a zadať pár riadkov. 44 00:02:19,080 --> 00:02:23,660 Ahoj. Moje meno je Jason. 45 00:02:23,660 --> 00:02:26,710 Nakoniec, budeme písať "quit". 46 00:02:26,710 --> 00:02:29,720 Ak by sme teraz vypísať všetky súbory v tomto adresári, 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 súbor tohto programu práve vytvorili. 49 00:02:36,110 --> 00:02:40,520 A samozrejme, je tiež nič viac, než dlhé postupnosti núl a jedničiek. 50 00:02:41,100 --> 00:02:43,260 Ak sme sa otvoriť tento nový súbor, 51 00:02:43,260 --> 00:02:45,870 vidíme 3 riadky kódu sme vstúpili do nášho programu - 52 00:02:46,060 --> 00:02:49,060 Ahoj. May meno je Jason. 53 00:02:49,580 --> 00:02:52,090 Ale čo sa vlastne deje, keď typewriter.c beží? 54 00:02:52,810 --> 00:02:55,520 Prvý riadok záujmu je pre nás linka 24. 55 00:02:55,560 --> 00:02:58,490 V tomto riadku, prehlasujeme, že náš ukazovateľ súboru. 56 00:02:59,080 --> 00:03:03,140 Funkcia, ktorá vracia tento ukazovateľ, fopen, vyžaduje dva argumenty. 57 00:03:03,140 --> 00:03:07,440 Prvý je názov súboru vrátane prípony súboru v prípade potreby. 58 00:03:07,440 --> 00:03:10,980 Pripomeňme si, že prípona neovplyvňuje súbor na najnižšej úrovni. 59 00:03:10,980 --> 00:03:14,640 Sme vždy riešenie s dlhou sekvenciu núl a jedničiek. 60 00:03:14,640 --> 00:03:19,630 Ale to predsa vplyv, ako sú súbory interpretované a aké aplikácie sú používané k otvoreniu je. 61 00:03:19,630 --> 00:03:22,290 Druhý argument funkcie fopen je jedno písmeno 62 00:03:22,290 --> 00:03:25,300 , Ktoré stoja za to, čo chceme robiť, keď sme otvorení súboru. 63 00:03:25,300 --> 00:03:30,630 Existujú tri možnosti pre tento argument - W, R, a A. 64 00:03:30,630 --> 00:03:34,900 Vybrali sme w v tomto prípade, pretože chceme zapisovať do súboru. 65 00:03:34,900 --> 00:03:38,820 R, ako asi tušíte, je pre čítanie súboru. 66 00:03:38,820 --> 00:03:41,760 A je pre pridanie do súboru. 67 00:03:41,760 --> 00:03:44,960 Aj keď ako w a môžu byť použité pre zápis do súborov, 68 00:03:44,960 --> 00:03:47,460 w začína od začiatku súboru 69 00:03:47,460 --> 00:03:50,810 a potenciálne prepísať všetky dáta, ktoré boli predtým uložené. 70 00:03:50,810 --> 00:03:54,070 V predvolenom nastavení je súbor otvárame, ak už neexistuje, 71 00:03:54,070 --> 00:03:57,180 je vytvorený v našom súčasnom pracovnom adresári. 72 00:03:57,180 --> 00:04:00,540 Avšak, ak chceme získať prístup, alebo vytvoriť súbor v inom mieste, 73 00:04:00,540 --> 00:04:02,650 v prvom argumente fopen, 74 00:04:02,650 --> 00:04:05,840 môžeme zadať cestu k súboru okrem názvu súboru. 75 00:04:05,840 --> 00:04:09,490 Zatiaľ čo prvá časť tohto procesu je len jeden riadok kódu dlhé, 76 00:04:09,490 --> 00:04:12,350 je to vždy dobré praxe o ďalšiu sadu čiar 77 00:04:12,350 --> 00:04:15,930 že presvedčte sa, že súbor bol úspešne otvorený alebo vytvorený. 78 00:04:15,930 --> 00:04:20,300 Ak fopen vráti null, by sme nechceli vpred s naším programom, 79 00:04:20,300 --> 00:04:23,270 ak tomu môže dôjsť v prípade, že operačný systém je z pamäte 80 00:04:23,270 --> 00:04:27,940 alebo ak sa pokúsite otvoriť súbor v adresári, pre ktoré sme nemali príslušné oprávnenie. 81 00:04:27,940 --> 00:04:31,780 >> Druhá časť procesu prebieha v písacieho stroja, zatiaľ čo slučky. 82 00:04:31,780 --> 00:04:35,000 Používame CS50 knižnice funkciu získať vstup od užívateľa, 83 00:04:35,000 --> 00:04:37,190 a za predpokladu, že nechcú opustiť program, 84 00:04:37,190 --> 00:04:41,940 sme použiť funkciu fputs, aby reťazec a zapíše ich do súboru. 85 00:04:41,940 --> 00:04:46,700 fputs je iba jedným z mnohých funkcií by sme mohli použiť na zápis do súboru. 86 00:04:46,700 --> 00:04:51,920 Iní zahŕňajú fwrite, fputc, a dokonca aj fprintf. 87 00:04:51,920 --> 00:04:54,840 Bez ohľadu na konkrétnu funkciu sme skončiť s použitím, i keď, 88 00:04:54,840 --> 00:04:57,480 všetky z nich potrebujete vedieť, prostredníctvom svojich argumentov, 89 00:04:57,480 --> 00:04:59,670 aspoň dve veci - 90 00:04:59,670 --> 00:05:03,140 čo treba písomná a ak je potrebné zapisovať. 91 00:05:03,140 --> 00:05:07,240 V našom prípade, vstup je reťazec, ktorý musí byť písomný 92 00:05:07,240 --> 00:05:11,290 a fp je ukazovateľ, ktorý smeruje nás k miestu, kde sme písať. 93 00:05:11,290 --> 00:05:15,330 V tomto programe, druhá časť procesu je pomerne jednoduché. 94 00:05:15,330 --> 00:05:17,360 Sme jednoducho vezme reťazec od užívateľa 95 00:05:17,360 --> 00:05:22,120 a pridaním priamo do nášho súboru s málo-to-no overovanie vstupu alebo bezpečnostné kontroly. 96 00:05:22,120 --> 00:05:26,160 Často sa však bude druhá časť zaberajú väčšinu kódu. 97 00:05:26,160 --> 00:05:30,580 Konečne, tretia časť je on-line 58, kde sme zatvorte súbor. 98 00:05:30,580 --> 00:05:34,860 Tu hovoríme fclose a odovzdať ju náš pôvodný súbor ukazovateľ. 99 00:05:34,860 --> 00:05:39,500 V nasledujúcom linke, vráti nulu, signalizujúce koniec nášho programu. 100 00:05:39,500 --> 00:05:42,630 A, áno, tretia časť je tak jednoduché. 101 00:05:42,630 --> 00:05:45,260 >> Poďme na čítanie zo súborov. 102 00:05:45,260 --> 00:05:48,220 Späť v našom adresári máme súbor s názvom printer.c. 103 00:05:48,220 --> 00:05:50,910 Poďme spustiť so súborom sme práve vytvorili - 104 00:05:50,910 --> 00:05:53,350 Doc.txt. 105 00:05:53,350 --> 00:05:58,150 Tento program, ako už názov napovedá, bude jednoducho vytlačiť z obsahu spisu odovzdané. 106 00:05:58,150 --> 00:06:00,230 A tu to máme. 107 00:06:00,230 --> 00:06:03,780 Riadky kódu sme písali skôr a uložené v doc.txt. 108 00:06:03,780 --> 00:06:06,980 Ahoj. Moje meno je Jason. 109 00:06:06,980 --> 00:06:09,120 Ak sa ponoríme do printer.c, 110 00:06:09,120 --> 00:06:13,570 vidíme, že veľa kódu vyzerá podobne ako to, čo sme práve prešli v typewriter.c. 111 00:06:13,570 --> 00:06:16,720 Naozaj riadok 22, kde sme otvorili súbor, 112 00:06:16,720 --> 00:06:19,220 a linka 39, kde sme uzavreli súbor, 113 00:06:19,220 --> 00:06:23,890 tak takmer totožné s typewriter.c, s výnimkou fopen druhý argument. 114 00:06:23,890 --> 00:06:26,510 Tentoraz sme čítanie zo súboru, 115 00:06:26,510 --> 00:06:29,040 takže sme sa rozhodli r miesto w. 116 00:06:29,040 --> 00:06:31,950 Tak, zamerajme na druhej časti procesu. 117 00:06:31,950 --> 00:06:36,060 V potrubí 35, ako druhý stav v našom 4 slučke, 118 00:06:36,060 --> 00:06:38,590 ak sme volať do fgets, 119 00:06:38,590 --> 00:06:42,190 spoločník funkciu fputs z pred. 120 00:06:42,190 --> 00:06:44,660 Tentoraz máme tri argumenty. 121 00:06:44,660 --> 00:06:48,810 Prvým z nich je ukazovateľ na pole znakov, kde reťazec bude uložená. 122 00:06:48,810 --> 00:06:52,670 Druhým je maximálny počet znakov, ktoré sa čítať. 123 00:06:52,670 --> 00:06:56,010 A tretí je ukazovateľ na súbor, s ktorými pracujete. 124 00:06:56,010 --> 00:07:00,780 Určite ste si všimli, že na slučke končí, keď fgets vráti null. 125 00:07:00,780 --> 00:07:02,940 Existujú dva dôvodom, že toto môže stať. 126 00:07:02,940 --> 00:07:05,380 Po prvé, môže dôjsť k chybe. 127 00:07:05,380 --> 00:07:10,740 Po druhé, a väčšia pravdepodobnosť, bol koniec súboru dosiahla a nie viac znakov boli čítané. 128 00:07:10,740 --> 00:07:14,040 V prípade, že ste premýšľal, dve funkcie existujú, ktoré nám umožní povedať 129 00:07:14,040 --> 00:07:17,160 z tohto dôvodu je príčinou tohto konkrétneho null ukazovateľ. 130 00:07:17,160 --> 00:07:21,090 A nie je divu, pretože majú čo do činenia s prácu so súbormi, 131 00:07:21,090 --> 00:07:26,940 ako fError funkcie a funkcie feof štart s písmenom f 132 00:07:26,940 --> 00:07:32,130 >> Napokon, pred tým, než k záveru, jedna rýchla zmienka o koniec súboru funkcií, 133 00:07:32,130 --> 00:07:36,690 ktorá, ako bolo práve uvedené, je písaný ako feof. 134 00:07:36,690 --> 00:07:41,550 Často zistíte, sami pomocou while a for slučky postupne prečítať si cestu cez súbory. 135 00:07:41,550 --> 00:07:45,790 Tak, budete potrebovať spôsob, ako ukončiť tieto slučky po dosiahnutí konca týchto súborov. 136 00:07:45,790 --> 00:07:50,510 Volanie feof na súborovom ukazovateľ a kontrola, či je to pravda 137 00:07:50,510 --> 00:07:52,310 by robiť len to. 138 00:07:52,310 --> 00:07:59,820 Tak môže while s podmienkou (! Feof (fp)) javí ako dokonale vhodného riešenia. 139 00:07:59,820 --> 00:08:03,770 Avšak, že máme jeden riadok vľavo v našom textovom súbore. 140 00:08:03,770 --> 00:08:07,130 Budeme vstúpi do nášho while a všetko bude fungovať tak, ako sa plánovalo. 141 00:08:07,130 --> 00:08:12,750 Na ďalšom kole cez, bude náš program skontroluje, či feof FP je pravda, 142 00:08:12,750 --> 00:08:15,430 ale - a to je kľúčový bod k pochopeniu tu - 143 00:08:15,430 --> 00:08:17,770 to nebude pravda zatiaľ. 144 00:08:17,770 --> 00:08:21,110 To je preto, že cieľom feof nie je kontrolovať 145 00:08:21,110 --> 00:08:24,400 ak ďalšie volania o prečítaní funkcii bude hit koniec súboru, 146 00:08:24,400 --> 00:08:28,190 , Ale skôr overiť, či je alebo nie je koniec súboru už bolo dosiahnuté. 147 00:08:28,190 --> 00:08:30,140 V prípade tohto príkladu, 148 00:08:30,140 --> 00:08:32,780 čítanie posledný riadok našom súbore ide plynule, 149 00:08:32,780 --> 00:08:36,210 ale program ešte nevie, že sme narazila na koniec nášho súboru. 150 00:08:36,210 --> 00:08:40,549 Nie je to až to robí jednu dodatočnú čítal že čítače konci súboru. 151 00:08:40,549 --> 00:08:43,210 Tak, správne podmienka je nasledujúci: 152 00:08:43,210 --> 00:08:49,330 fgets a jeho tri argumenty - výstup, veľkosť výstupu, a fp - 153 00:08:49,330 --> 00:08:52,570 a to všetko nie je rovná null. 154 00:08:52,570 --> 00:08:55,260 Tento prístup je sme sa v printer.c, 155 00:08:55,260 --> 00:08:57,890 a v tomto prípade sa po slučky východom, 156 00:08:57,890 --> 00:09:04,290 by sa dalo nazvať feof alebo fError informovať užívateľa, pokiaľ ide o osobitné argumentácie pre ukončenie tejto slučky. 157 00:09:04,290 --> 00:09:08,100 >> Písanie a čítanie zo súboru, je na jeho najzákladnejšie, 158 00:09:08,100 --> 00:09:10,150 Jednoduchý 3-dielna proces. 159 00:09:10,150 --> 00:09:12,530 Po prvé, sme sa otvoriť súbor. 160 00:09:12,530 --> 00:09:16,740 Po druhé, sme dať nejaké veci do nášho súboru alebo sa niektoré veci z neho. 161 00:09:16,740 --> 00:09:19,200 Po tretie, zavrieme súbor. 162 00:09:19,200 --> 00:09:21,170 Prvé a posledné časti sú jednoduché. 163 00:09:21,170 --> 00:09:23,920 Prostredná časť je miesto, kde chúlostivé veci spočíva. 164 00:09:23,920 --> 00:09:27,760 A aj keď pod kapotou sme vždy riešenie s dlhou sekvenciu núl a jednotiek, 165 00:09:27,760 --> 00:09:30,710 to pomôže pri kódovaní pridať vrstvu abstrakcie 166 00:09:30,710 --> 00:09:35,350 , Ktorý zmení poradie na niečo, čo viac podobá, čo sme zvyknutí vídať. 167 00:09:35,350 --> 00:09:39,570 Napríklad, ak budeme pracovať s 24-bitový bitmapový súbor, 168 00:09:39,570 --> 00:09:43,290 budeme pravdepodobne pri čítaní alebo zápise tri bajty naraz. 169 00:09:43,290 --> 00:09:46,450 V takom prípade, by to zmysel definovať a vhodne pomenovať 170 00:09:46,450 --> 00:09:48,980 struct, ktorý je 3 bajty veľký. 171 00:09:48,980 --> 00:09:51,410 >> Hoci práca so súbormi môže zdať zložité, 172 00:09:51,410 --> 00:09:54,530 využitie je nám umožňuje urobiť niečo naozaj pozoruhodný. 173 00:09:54,530 --> 00:09:58,880 Môžeme zmeniť stav sveta mimo našu programu, 174 00:09:58,880 --> 00:10:01,730 môžeme vytvoriť niečo, čo žije mimo živote nášho programu, 175 00:10:01,730 --> 00:10:07,190 alebo môžeme dokonca niečo zmeniť, ktorá bola vytvorená pred náš program rozbehol. 176 00:10:07,190 --> 00:10:11,210 Interakcie so súbormi je naozaj silný časť programovania v jazyku C. 177 00:10:11,210 --> 00:10:15,300 a ja som nadšený, aby videli, čo budete vytvárať s ním v kóde, ktorý príde. 178 00:10:15,300 --> 00:10:19,770 Moje meno 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 >> [Smiech] 181 00:10:25,940 --> 00:10:29,330 Dobre. Jedna sa. Ideme na to. 182 00:10:49,000 --> 00:10:52,140 Keď si myslíme, že súboru - >> Oh, počkať. Prepáčte. 183 00:10:52,140 --> 00:10:56,800 [Smiech] Tak. 184 00:11:06,620 --> 00:11:09,970 Hey there. 185 00:11:13,670 --> 00:11:16,310 Keď si myslíme, že súboru - 186 00:11:17,610 --> 00:11:20,710 Ak si myslíte, že o súbore - Dobre. Povedz mi, až budeš pripravená. 187 00:11:20,710 --> 00:11:22,520 Oh, skvelé. 188 00:11:22,520 --> 00:11:26,180 Hoci čítanie z teleprompter môže zdať - no. Moja chyba.