1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Datoteke 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 Ko razmišljamo o datoteki, kar pride na misel, je Microsoft Word dokument, 5 00:00:11,000 --> 00:00:14,000 JPEG ali MP3 song, 6 00:00:14,000 --> 00:00:17,000 in smo interakcijo z vsako od teh vrst datotek na različne načine. 7 00:00:17,000 --> 00:00:20,000 Na primer, v Wordovem dokumentu bomo dodali besedilo 8 00:00:20,000 --> 00:00:24,000 medtem ko se v JPEG sliko bomo morda obrezati iz robov ali retuširanje barve. 9 00:00:24,000 --> 00:00:28,000 Vendar pod pokrovom vse datoteke na našem računalniku, niso nič bolj 10 00:00:28,000 --> 00:00:31,000 od dolgega zaporedja ničel in enic. 11 00:00:31,000 --> 00:00:33,000 To je do posebne vloge, ki sodeluje z datoteko 12 00:00:33,000 --> 00:00:38,000 odločiti, kako obdelati dolgo zaporedje in ga predstaviti vsem uporabnikom. 13 00:00:38,000 --> 00:00:41,000 Po eni strani lahko dokument ogledate na samo en bajt, 14 00:00:41,000 --> 00:00:45,000 ali 8 ničel in enic in prikazati ASCII znak na zaslonu. 15 00:00:45,000 --> 00:00:48,000 Po drugi strani pa se lahko bitna slika ogledate na 3 bajte, 16 00:00:48,000 --> 00:00:50,000 ali 24 ničel in enic, 17 00:00:50,000 --> 00:00:53,000 in jih razlagati kot 3 šestnajstiških številk 18 00:00:53,000 --> 00:00:56,000 da so vrednosti za rdeče, zelene in modre 19 00:00:56,000 --> 00:00:58,000 v enem pixel slike. 20 00:00:58,000 --> 00:01:01,000 Karkoli lahko videti na zaslonu, v svojem bistvu, 21 00:01:01,000 --> 00:01:05,000 Datoteke niso nič več kot zaporedje ničel in enic. 22 00:01:05,000 --> 00:01:08,000 Torej se potopite v in poglej kako dejansko spreminjanja teh ničel in enic 23 00:01:08,000 --> 00:01:12,000 ko gre za pisno in branje iz datoteke. 24 00:01:12,000 --> 00:01:15,000 >> Začela bom, da ga razbije na preprost 3-del procesa. 25 00:01:15,000 --> 00:01:19,000 Naslednja, bom se potopite v dveh oznako primerov, ki dokazujejo te tri dele. 26 00:01:19,000 --> 00:01:23,000 Končno bom pregledala postopek in nekaterih njegovih najpomembnejših informacij. 27 00:01:23,000 --> 00:01:25,000 Kot pri vseh datotek, ki sedi na namizju 28 00:01:25,000 --> 00:01:28,000 prva stvar je, da se odpre. 29 00:01:28,000 --> 00:01:31,000 C to storimo tako, da razglasi kazalec na vnaprej struct 30 00:01:31,000 --> 00:01:33,000 , ki predstavlja datoteko na disku. 31 00:01:33,000 --> 00:01:38,460 V tem klicu funkcije, prav tako odločiti, ali želimo pisati ali brati iz datoteke. 32 00:01:38,460 --> 00:01:41,660 Nato, bomo dejansko branje in pisanje. 33 00:01:41,660 --> 00:01:44,800 Obstajajo številne specializirane funkcije lahko uporabite v tem delu, 34 00:01:44,800 --> 00:01:48,790 in skoraj vse izmed njih začne s črko F, ​​ki stoji za datoteko. 35 00:01:48,790 --> 00:01:53,560 Zadnja, podobno drobnih rdečih X v zgornjem desnem kotu datotek odpre na vašem računalniku, 36 00:01:53,560 --> 00:01:56,680 zapremo datoteko s klicem končno funkcijo. 37 00:01:56,680 --> 00:01:59,540 Zdaj, ko imamo splošno predstavo o tem, kaj bomo storili, 38 00:01:59,540 --> 00:02:02,000 dajmo se potopite v kodo. 39 00:02:02,000 --> 00:02:06,100 >> V tej mapi imamo dve C datotek in njihove ustrezne izvršilne datoteke. 40 00:02:06,100 --> 00:02:09,710 Pisalni stroj program traja en argument v ukazni vrstici, 41 00:02:09,710 --> 00:02:12,060 ime dokumenta želimo ustvariti. 42 00:02:12,060 --> 00:02:16,160 V tem primeru, bomo rekli doc.txt. 43 00:02:16,160 --> 00:02:19,080 Naj zaženite program in vnesite nekaj vrstic. 44 00:02:19,080 --> 00:02:23,660 Pozdravljeni. Moje ime je Jason. 45 00:02:23,660 --> 00:02:26,710 Na koncu bomo vpišite "zaprete". 46 00:02:26,710 --> 00:02:29,720 Če bomo zdaj seznam vseh datotek v tem imeniku, 47 00:02:29,720 --> 00:02:33,770 vidimo, da obstaja nov dokument, imenovan doc.txt. 48 00:02:34,190 --> 00:02:36,110 To je datoteka ta program pravkar ustvarili. 49 00:02:36,110 --> 00:02:40,520 In seveda, tudi ni nič več kot dolgega zaporedja ničel in enic. 50 00:02:41,100 --> 00:02:43,260 Če bomo odprli to novo datoteko, 51 00:02:43,260 --> 00:02:45,870 vidimo 3 vrstic kode smo vnesli v naš program - 52 00:02:46,060 --> 00:02:49,060 Pozdravljeni. Maj je ime Jason. 53 00:02:49,580 --> 00:02:52,090 Toda kaj se dejansko dogaja, ko typewriter.c teče? 54 00:02:52,810 --> 00:02:55,520 V prvi vrstici pomena za nas je linija 24. 55 00:02:55,560 --> 00:02:58,490 V skladu s tem izjavljamo, naš datotečnega kazalca. 56 00:02:59,080 --> 00:03:03,140 Funkcija, ki vrne kazalec this, fopen, traja dva argumenta. 57 00:03:03,140 --> 00:03:07,440 Prvi je ime datoteke vključno s pripono, če je to primerno. 58 00:03:07,440 --> 00:03:10,980 Spomnimo se, da končnica ne vpliva na sliko na najnižji ravni. 59 00:03:10,980 --> 00:03:14,640 Vedno smo se ukvarjajo z dolgo zaporedje ničel in enic. 60 00:03:14,640 --> 00:03:19,630 Vendar pa to ne vpliva, kako so datoteke razlagati in za kaj se uporablja aplikacije za odpiranje vrat. 61 00:03:19,630 --> 00:03:22,290 Drugi argument za fopen je ena črka 62 00:03:22,290 --> 00:03:25,300 ki se zavzema za to, kaj nameravate storiti potem, ko smo datoteko odpreti. 63 00:03:25,300 --> 00:03:30,630 Obstajajo tri možnosti za to trditev - W, R, in A. 64 00:03:30,630 --> 00:03:34,900 Mi smo izbrali w v tem primeru, ker želimo pisati v datoteko. 65 00:03:34,900 --> 00:03:38,820 R, kot ste verjetno uganili, je za branje v datoteko. 66 00:03:38,820 --> 00:03:41,760 In je za dodajanje sporočil v datoteko. 67 00:03:41,760 --> 00:03:44,960 Medtem ko sta w in se lahko uporablja za pisanje v datoteke, 68 00:03:44,960 --> 00:03:47,460 w bo začel pisati od začetka datoteke 69 00:03:47,460 --> 00:03:50,810 in potencialno prepišete vse podatke, ki so že bili shranjeni. 70 00:03:50,810 --> 00:03:54,070 Privzeto je datoteka se nam odpre, če ne obstaja, 71 00:03:54,070 --> 00:03:57,180 ustvarjen v naši sedanji delovni imenik. 72 00:03:57,180 --> 00:04:00,540 Vendar, če želimo, da odprete ali ustvarite datoteko na drugo mesto, 73 00:04:00,540 --> 00:04:02,650 V prvem argumentu fopen, 74 00:04:02,650 --> 00:04:05,840 smo lahko določite pot do datoteke, poleg imena datoteke. 75 00:04:05,840 --> 00:04:09,490 Medtem ko je prvi del tega procesa je le ena vrstica kode dolgo, 76 00:04:09,490 --> 00:04:12,350 to je vedno dobra praksa, da se vključi še en niz vrstic 77 00:04:12,350 --> 00:04:15,930 da preveri, ali je bila datoteka uspešno odprli ali ustvarili. 78 00:04:15,930 --> 00:04:20,300 Če fopen vrne null, si ne bi želel, da korak naprej v našem programu, 79 00:04:20,300 --> 00:04:23,270 in to lahko zgodi, če je operacijski sistem iz spomina 80 00:04:23,270 --> 00:04:27,940 ali če se želimo odpreti datoteke v imenike, za katere nismo imeli ustreznih dovoljenj. 81 00:04:27,940 --> 00:04:31,780 >> Drugi del procesa poteka, medtem ko pisalnim strojem zanke. 82 00:04:31,780 --> 00:04:35,000 Mi uporabljamo CS50 knjižnično funkcijo, da bi dobili prispevek od uporabnika, 83 00:04:35,000 --> 00:04:37,190 in ob predpostavki, da ne želijo zapustiti programa, 84 00:04:37,190 --> 00:04:41,940 bomo uporabili funkcijo fputs naj niz in pisati, da v spis. 85 00:04:41,940 --> 00:04:46,700 fputs je le ena od mnogih funkcij, da bi nam pisati v datoteko. 86 00:04:46,700 --> 00:04:51,920 Drugi so fwrite, fputc in celo ovrednotenj. 87 00:04:51,920 --> 00:04:54,840 Ne glede na določene funkcije smo na koncu z uporabo, čeprav 88 00:04:54,840 --> 00:04:57,480 vsi vedeti, prek svojih argumentov, 89 00:04:57,480 --> 00:04:59,670 vsaj dve stvari - 90 00:04:59,670 --> 00:05:03,140 kaj je treba pisno in v katerih mora biti napisana na. 91 00:05:03,140 --> 00:05:07,240 V našem primeru, vhod je niz, ki mora biti napisana 92 00:05:07,240 --> 00:05:11,290 fp in je kazalec, ki nas usmerja tja, kjer smo pisanje. 93 00:05:11,290 --> 00:05:15,330 V tem programu, drugi del tega procesa je dokaj enostavna. 94 00:05:15,330 --> 00:05:17,360 Mi smo le ob vrvico od uporabnika 95 00:05:17,360 --> 00:05:22,120 in ga dodate na naš datoteko z malo-to-ni vhod preverjanje, ali varnostna preverjanja. 96 00:05:22,120 --> 00:05:26,160 Pogosto pa se bo v drugem delu prevzel večji del kode. 97 00:05:26,160 --> 00:05:30,580 Končno, tretji del je na liniji 58, kjer smo zaprite datoteko. 98 00:05:30,580 --> 00:05:34,860 Tu pravimo fclose in jih prenesti našo prvotno kazalec datoteke. 99 00:05:34,860 --> 00:05:39,500 V naslednji vrstici se vrnemo nič, signalizacija konec našega programa. 100 00:05:39,500 --> 00:05:42,630 In, ja, tretji del je tako enostavno, kot to. 101 00:05:42,630 --> 00:05:45,260 >> Pojdimo k branju iz datoteke. 102 00:05:45,260 --> 00:05:48,220 Nazaj v našem imamo datoteko imenovano printer.c. 103 00:05:48,220 --> 00:05:50,910 Naj ga zaženite z datoteko pravkar ustvarili - 104 00:05:50,910 --> 00:05:53,350 doc.txt. 105 00:05:53,350 --> 00:05:58,150 Ta program, kot že ime pove, bo preprosto izpiše vsebino datoteke prenesejo nanjo. 106 00:05:58,150 --> 00:06:00,230 In tam jo imamo. 107 00:06:00,230 --> 00:06:03,780 Vrstic kode smo vnesli prej in shrani v doc.txt. 108 00:06:03,780 --> 00:06:06,980 Pozdravljeni. Moje ime je Jason. 109 00:06:06,980 --> 00:06:09,120 Če se spustimo v printer.c, 110 00:06:09,120 --> 00:06:13,570 vidimo, da je videti veliko kode podobno temu, kar smo pravkar vstopil skozi v typewriter.c. 111 00:06:13,570 --> 00:06:16,720 Dejansko linija 22, kjer smo odprli datoteko, 112 00:06:16,720 --> 00:06:19,220 in linija 39, kjer je zaključil spis, 113 00:06:19,220 --> 00:06:23,890 sta skoraj identična typewriter.c, razen za fopen drugega argumenta. 114 00:06:23,890 --> 00:06:26,510 Tokrat smo branje iz datoteke, 115 00:06:26,510 --> 00:06:29,040 Tako smo se odločili, namesto r w. 116 00:06:29,040 --> 00:06:31,950 Tako, dajmo osredotočiti na drugem delu procesa. 117 00:06:31,950 --> 00:06:36,060 V skladu 35, kot drugi pogoj iz našega 4 zanke, 118 00:06:36,060 --> 00:06:38,590 smo klic, da fgets, 119 00:06:38,590 --> 00:06:42,190 spremljevalec funkcijo fputs od prej. 120 00:06:42,190 --> 00:06:44,660 Tokrat imamo tri argumente. 121 00:06:44,660 --> 00:06:48,810 Prvi je kazalec na niz znakov, kjer bodo shranjeni niz. 122 00:06:48,810 --> 00:06:52,670 Drugi je največje število znakov, ki jih je treba brati. 123 00:06:52,670 --> 00:06:56,010 In tretja je kazalec na datoteko, s katerimi delamo. 124 00:06:56,010 --> 00:07:00,780 Opazili boste, da se zanka konča, ko fgets vrne null. 125 00:07:00,780 --> 00:07:02,940 Obstajata dva razloga, da se je to lahko zgodilo. 126 00:07:02,940 --> 00:07:05,380 Prvič, lahko prišlo do napake. 127 00:07:05,380 --> 00:07:10,740 Drugič, in bolj verjetno je bil konec datoteke dosežen in ni več znakov, je bilo brati. 128 00:07:10,740 --> 00:07:14,040 V primeru, da ste se spraševala, dve funkciji ne obstajajo, da nam omogočajo, da povem 129 00:07:14,040 --> 00:07:17,160 Razlog, ki je vzrok za to posebno kazalca null. 130 00:07:17,160 --> 00:07:21,090 In, kar ni presenetljivo, saj ima to opraviti z delo z datotekami, 131 00:07:21,090 --> 00:07:26,940 tako fError funkcijo in funkcijo start feof s črko f. 132 00:07:26,940 --> 00:07:32,130 >> Končno, preden zaključimo, eno kratko opozorilo o izteku delovanja datoteke 133 00:07:32,130 --> 00:07:36,690 ki je, kot že omenjeno, je zapisan kot feof. 134 00:07:36,690 --> 00:07:41,550 Pogosto boste znašli z uporabo while in for zanke postopoma prebral svojo pot skozi datotek. 135 00:07:41,550 --> 00:07:45,790 Tako boste morali način za končanje te zanke ko pridete do konca teh datotek. 136 00:07:45,790 --> 00:07:50,510 Klicanje feof na datotečni kazalec in preverjanje, da vidim, če je res 137 00:07:50,510 --> 00:07:52,310 bi storil prav to. 138 00:07:52,310 --> 00:07:59,820 Tako si lahko, medtem ko zanka s pogojem (! Feof (fp)) zdi popolnoma ustrezno rešitev. 139 00:07:59,820 --> 00:08:03,770 Vendar pravijo, da imamo eno vrstico, ki je ostala v našem besedilno datoteko. 140 00:08:03,770 --> 00:08:07,130 Bomo vstopijo v našo while zanko, pa bo vse izšlo po načrtih. 141 00:08:07,130 --> 00:08:12,750 V naslednjem krogu skozi, bo naš program preverite, če feof FP je res, 142 00:08:12,750 --> 00:08:15,430 ampak - in to je ključna točka tukaj razumeti - 143 00:08:15,430 --> 00:08:17,770 da ne bo res samo še. 144 00:08:17,770 --> 00:08:21,110 To je zato, ker je namen feof ni za pregled 145 00:08:21,110 --> 00:08:24,400 če bo naslednji razpis za branje funkcijo hit konec datoteke 146 00:08:24,400 --> 00:08:28,190 ampak za preverjanje, ali je konec datoteke že dosežena. 147 00:08:28,190 --> 00:08:30,140 Pri tem na primer, 148 00:08:30,140 --> 00:08:32,780 branje zadnjo linijo našega spisa gre odlično gladko, 149 00:08:32,780 --> 00:08:36,210 vendar program še ne ve, da smo zadeli konec naše datoteke. 150 00:08:36,210 --> 00:08:40,549 Ne, dokler se ne eno dodatno branje, ki jih števci koncu datoteke. 151 00:08:40,549 --> 00:08:43,210 Tako bi pravilno stanje, so naslednji: 152 00:08:43,210 --> 00:08:49,330 fgets in njegove tri trditve - proizvodnja, obseg proizvodnje in fp - 153 00:08:49,330 --> 00:08:52,570 in vsi, ki ni enaka null. 154 00:08:52,570 --> 00:08:55,260 To je pristop, ki smo vzel v printer.c, 155 00:08:55,260 --> 00:08:57,890 in v tem primeru, potem ko zanke izhodov, 156 00:08:57,890 --> 00:09:04,290 lahko bi rekli feof ali fError obvestiti uporabnika, da se posebne obrazložitve za izhod iz te zanke. 157 00:09:04,290 --> 00:09:08,100 >> Pisanje in branje iz datoteke je na najbolj osnovno, 158 00:09:08,100 --> 00:09:10,150 preprost 3-del procesa. 159 00:09:10,150 --> 00:09:12,530 Najprej smo odpreti. 160 00:09:12,530 --> 00:09:16,740 Drugič, dal nekaj stvari v naši datoteke ali pa nekaj stvari od njega. 161 00:09:16,740 --> 00:09:19,200 Tretjič, zaprite datoteko. 162 00:09:19,200 --> 00:09:21,170 Prvi in ​​zadnji deli so enostavno. 163 00:09:21,170 --> 00:09:23,920 Osrednji del je, če je zahtevna stvar leži. 164 00:09:23,920 --> 00:09:27,760 In čeprav pod pokrovom smo vedno ukvarjajo z dolgo zaporedje ničel in enic, 165 00:09:27,760 --> 00:09:30,710 to ne pomaga pri kodiranju dodati plast abstrakcije 166 00:09:30,710 --> 00:09:35,350 da spremeni vrstni red v nekaj, kar je bolj podobno, kar smo vajeni. 167 00:09:35,350 --> 00:09:39,570 Na primer, če delamo z 24-bitno datoteko bitne slike, 168 00:09:39,570 --> 00:09:43,290 bomo verjetno branjem ali zapisovanjem 3 bajte naenkrat. 169 00:09:43,290 --> 00:09:46,450 V tem primeru bi bilo smiselno opredeliti in ustrezno poimenovanje 170 00:09:46,450 --> 00:09:48,980 struct, ki je 3 biti velik. 171 00:09:48,980 --> 00:09:51,410 >> Čeprav lahko delo z datotekami zdi zapleteno, 172 00:09:51,410 --> 00:09:54,530 njihovo uporabo nam omogoča, da narediš nekaj resnično izjemen. 173 00:09:54,530 --> 00:09:58,880 Mi lahko spremenite stanje sveta zunaj našega programa, 174 00:09:58,880 --> 00:10:01,730 bomo lahko ustvarili nekaj, kar živi dlje od trajanja našega programa, 175 00:10:01,730 --> 00:10:07,190 ali lahko sploh kaj spremeniti, ki je nastal pred naš program začeli izvajati. 176 00:10:07,190 --> 00:10:11,210 Interakcija z datotekami je resnično močna del programov v C. 177 00:10:11,210 --> 00:10:15,300 in sem navdušena, da vidite, kaj boste ustvarili z njim v kodo, ki prihaja. 178 00:10:15,300 --> 00:10:19,770 Moje ime 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 >> [Smeh] 181 00:10:25,940 --> 00:10:29,330 Ok. Ena sprejeti. Pa gremo. 182 00:10:49,000 --> 00:10:52,140 Ko razmišljamo o datoteki - >> Oh, počakaj. Žal mi je. 183 00:10:52,140 --> 00:10:56,800 [Smeh] V redu. 184 00:11:06,620 --> 00:11:09,970 Pozdravljeni. 185 00:11:13,670 --> 00:11:16,310 Ko razmišljamo o datoteki - 186 00:11:17,610 --> 00:11:20,710 Če menite, da datoteke - Ok. Povej mi, ko boš pripravljen. 187 00:11:20,710 --> 00:11:22,520 Oh, super. 188 00:11:22,520 --> 00:11:26,180 Čeprav je branje iz teleprompter se morda zdi - ni. Moja napaka.