1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [File I / O] 2 00:00:02,000 --> 00:00:04,000 [Jason Hirschhorn, Sveučilište Harvard] 3 00:00:04,000 --> 00:00:07,000 [Ovo je CS50, CS50.TV] 4 00:00:07,000 --> 00:00:11,000 Kada mislimo datoteke, što padne na pamet je dokument Microsoft Word, 5 00:00:11,000 --> 00:00:14,000 JPEG slika ili MP3 pjesma, 6 00:00:14,000 --> 00:00:17,000 i mi komunicirati sa svaki od tih tipova datoteka u različite načine. 7 00:00:17,000 --> 00:00:20,000 Na primjer, u dokumentu programa Word smo dodali tekst 8 00:00:20,000 --> 00:00:24,000 dok je sa JPEG slike možemo izrezivati ​​iz rubova ili retuširati boje. 9 00:00:24,000 --> 00:00:28,000 Ipak, ispod haube sve datoteke u naše računalo nisu ništa više 10 00:00:28,000 --> 00:00:31,000 od dugog niza nula i one. 11 00:00:31,000 --> 00:00:33,000 To je do određene aplikacije koja komunicira s datotekom 12 00:00:33,000 --> 00:00:38,000 odlučiti kako će obraditi ovaj dugo slijed i prezentirati ga na korisnika. 13 00:00:38,000 --> 00:00:41,000 S jedne strane, dokument može pogledati samo jednom bajtu, 14 00:00:41,000 --> 00:00:45,000 ili osam nula i one, i prikazati ASCII znaka na zaslonu. 15 00:00:45,000 --> 00:00:48,000 S druge strane, skenirana slika može pogledati tri bajtovima, 16 00:00:48,000 --> 00:00:50,000 ili 24 nula i one, 17 00:00:50,000 --> 00:00:53,000 i tumačiti ih kao tri heksadecimalni brojevi 18 00:00:53,000 --> 00:00:56,000 koji predstavljaju vrijednosti za crvenu, zelenu i plavu 19 00:00:56,000 --> 00:00:58,000 u jednom pikselu od slike. 20 00:00:58,000 --> 00:01:01,000 Što god oni svibanj izgledati na zaslonu, na svom srcu, 21 00:01:01,000 --> 00:01:05,000 Datoteke nisu ništa više od niza nula i one. 22 00:01:05,000 --> 00:01:08,000 Dakle, neka je roniti i gledati kako mi zapravo manipulirati tih nula i one 23 00:01:08,000 --> 00:01:12,000 kada je u pitanju pisanja i čitanja iz datoteke. 24 00:01:12,000 --> 00:01:15,000 >> Počet ću ga razbijanje na jednostavan 3-dio procesa. 25 00:01:15,000 --> 00:01:19,000 Dalje, ja ću zaroniti u dvije kod primjera koji pokazuju ove tri dijela. 26 00:01:19,000 --> 00:01:23,000 Konačno, ja ću pregledati proces, a neke od njegovih najvažnijih detalja. 27 00:01:23,000 --> 00:01:25,000 Kao i kod bilo koje datoteke koji sjedi na radnoj površini, 28 00:01:25,000 --> 00:01:28,000 prva stvar za učiniti je da ga otvorite. 29 00:01:28,000 --> 00:01:31,000 U C činimo to proglašavajući pokazivač na predefinirane struct 30 00:01:31,000 --> 00:01:33,000 koji predstavlja datoteku na disk. 31 00:01:33,000 --> 00:01:38,460 U tom funkcijom poziva, mi također odlučiti hoće li želimo pisati ili čitati iz datoteke. 32 00:01:38,460 --> 00:01:41,660 Dalje, mi stvarni čitanje i pisanje. 33 00:01:41,660 --> 00:01:44,800 Postoji nekoliko specijaliziranih funkcija možemo koristiti u ovom dijelu, 34 00:01:44,800 --> 00:01:48,790 a gotovo svi od njih početi s slovom F, koja se zalaže za datoteku. 35 00:01:48,790 --> 00:01:53,560 Posljednja, srodan malim crvenim X u gornjem kutu datoteka otvoriti na računalu, 36 00:01:53,560 --> 00:01:56,680 smo zatvorili datoteku s konačnim funkcije poziva. 37 00:01:56,680 --> 00:01:59,540 Sada kada imamo opću ideju o tome što ćemo učiniti, 38 00:01:59,540 --> 00:02:02,000 ajmo uronite u kodu. 39 00:02:02,000 --> 00:02:06,100 >> U ovom imeniku, imamo dva C datoteke i njihove odgovarajuće izvršne datoteke. 40 00:02:06,100 --> 00:02:09,710 Pisaći stroj Program traje jedan argument naredbenog retka, 41 00:02:09,710 --> 00:02:12,060 naziv dokumenta želimo stvoriti. 42 00:02:12,060 --> 00:02:16,160 U tom slučaju, mi ćemo ga zovu doc.txt. 43 00:02:16,160 --> 00:02:19,080 Ajmo pokrenuti program i unesite nekoliko redaka. 44 00:02:19,080 --> 00:02:23,660 Bok. Moje ime je Jason. 45 00:02:23,660 --> 00:02:26,710 Konačno, mi ćemo upisati "zatvoriti". 46 00:02:26,710 --> 00:02:29,720 Ako mi sada popis svih datoteka u tom direktoriju, 47 00:02:29,720 --> 00:02:33,770 vidimo da novi dokument postoji zove doc.txt. 48 00:02:34,190 --> 00:02:36,110 To je datoteka ovaj program upravo stvorili. 49 00:02:36,110 --> 00:02:40,520 I naravno, to je previše je ništa više od dugog niza nula i one. 50 00:02:41,100 --> 00:02:43,260 Ako smo otvorili ovu novu datoteku, 51 00:02:43,260 --> 00:02:45,870 vidimo tri linije koda smo ušli u našem programu - 52 00:02:46,060 --> 00:02:49,060 Bok. Svibanj ime je Jason. 53 00:02:49,580 --> 00:02:52,090 No, ono što se zapravo događa kada typewriter.c radi? 54 00:02:52,810 --> 00:02:55,520 U prvom redu od interesa za nas je linija 24. 55 00:02:55,560 --> 00:02:58,490 U skladu s tim, mi iskazujemo svoju pokazivač datoteke. 56 00:02:59,080 --> 00:03:03,140 Funkcija koja vraća ovaj pokazivač, fopen, uzima dva argumenta. 57 00:03:03,140 --> 00:03:07,440 Prvi je naziv datoteke, uključujući ekstenzijom ako je potrebno. 58 00:03:07,440 --> 00:03:10,980 Podsjetimo da ekstenzija datoteke ne utječe na sliku na najnižoj razini. 59 00:03:10,980 --> 00:03:14,640 Uvijek smo se bave dugog niza nula i one. 60 00:03:14,640 --> 00:03:19,630 No, to ne utječe kako su datoteke tumačiti i ono aplikacije koriste ih otvoriti. 61 00:03:19,630 --> 00:03:22,290 Drugi argument za fopen je slovo 62 00:03:22,290 --> 00:03:25,300 koja se zalaže za ono što planiramo učiniti nakon što smo otvorili datoteku. 63 00:03:25,300 --> 00:03:30,630 Postoje tri opcije za ovaj argument - W, R, i A. 64 00:03:30,630 --> 00:03:34,900 Odabrali smo w u ovom slučaju, jer želimo pisati u datoteku. 65 00:03:34,900 --> 00:03:38,820 R, kao što vjerojatno možete pogoditi, je za čitanje u datoteci. 66 00:03:38,820 --> 00:03:41,760 A je za dodavanje u datoteku. 67 00:03:41,760 --> 00:03:44,960 Iako su obje w i može se koristiti za pisanje u datoteke, 68 00:03:44,960 --> 00:03:47,460 w će početi pisati od početka datoteke 69 00:03:47,460 --> 00:03:50,810 i potencijalno prepisati sve podatke koji su prethodno pohranjeni. 70 00:03:50,810 --> 00:03:54,070 Po defaultu, datoteka smo otvorili, ako već ne postoji, 71 00:03:54,070 --> 00:03:57,180 se stvara u našem sadašnjem radnom direktoriju. 72 00:03:57,180 --> 00:04:00,540 Međutim, ako želimo pristup ili stvoriti datoteku u nekom drugom mjestu, 73 00:04:00,540 --> 00:04:02,650 u prvom argumentu fopen, 74 00:04:02,650 --> 00:04:05,840 možemo odrediti put datoteke uz ime datoteke. 75 00:04:05,840 --> 00:04:09,490 Dok je prvi dio ovog procesa je samo jedna linija koda dugo, 76 00:04:09,490 --> 00:04:12,350 to je uvijek dobra praksa da su drugi set linija 77 00:04:12,350 --> 00:04:15,930 da provjerite da li je datoteka uspješno otvorena je ili urednik. 78 00:04:15,930 --> 00:04:20,300 Ako fopen vraća null, ne bismo željeli da krivotvoriti naprijed s našim programom, 79 00:04:20,300 --> 00:04:23,270 a to se može dogoditi ako se operativni sustav je iz memorije 80 00:04:23,270 --> 00:04:27,940 ili ako ćemo pokušati otvoriti datoteku u direktorij za koje nismo imali odgovarajuće dozvole. 81 00:04:27,940 --> 00:04:31,780 >> Dio dva procesa odvija u pisaći stroj je while petlje. 82 00:04:31,780 --> 00:04:35,000 Mi koristimo CS50 knjižnice funkciju kako bi dobili informacije od korisnika, 83 00:04:35,000 --> 00:04:37,190 i uz pretpostavku da se ne žele prestati program, 84 00:04:37,190 --> 00:04:41,940 mi koristimo funkcijske fputs uzeti string i napisati ga u datoteku. 85 00:04:41,940 --> 00:04:46,700 fputs je samo jedan od mnogih funkcija možemo koristiti za pisanje u datoteku. 86 00:04:46,700 --> 00:04:51,920 Drugi su fwrite, fputc, pa čak i fprintf. 87 00:04:51,920 --> 00:04:54,840 Bez obzira na određene funkcije možemo završiti koristeći, ipak, 88 00:04:54,840 --> 00:04:57,480 sve njih treba znati, putem svojih argumenata, 89 00:04:57,480 --> 00:04:59,670 najmanje dvije stvari - 90 00:04:59,670 --> 00:05:03,140 ono što treba biti napisano i gdje to treba biti napisan. 91 00:05:03,140 --> 00:05:07,240 U našem slučaju, ulaz je niz koji treba biti napisan 92 00:05:07,240 --> 00:05:11,290 a fp je pokazivač koji nas usmjerava tamo gdje pišemo. 93 00:05:11,290 --> 00:05:15,330 U ovom programu, dio dva procesa je prilično jednostavan. 94 00:05:15,330 --> 00:05:17,360 Mi jednostavno uzimanje niz od korisnika 95 00:05:17,360 --> 00:05:22,120 i dodao izravno na našoj datoteci s malo-to-nema ulaz validacija ili sigurnosne provjere. 96 00:05:22,120 --> 00:05:26,160 Često, međutim, dio njih će dvoje zauzimaju najveći dio svog koda. 97 00:05:26,160 --> 00:05:30,580 Konačno, dio tri je na liniji 58, gdje ćemo zatvoriti datoteku. 98 00:05:30,580 --> 00:05:34,860 Ovdje zovemo fclose i to prođe naš izvorni datotečni pokazivač. 99 00:05:34,860 --> 00:05:39,500 U sljedećem retku, vraćamo nula, signalizirajući kraj našeg programa. 100 00:05:39,500 --> 00:05:42,630 I, da, dio tri je kao jednostavan kao taj. 101 00:05:42,630 --> 00:05:45,260 >> Idemo na čitanje iz datoteke. 102 00:05:45,260 --> 00:05:48,220 Povratak u našem imeniku imamo datoteku pod nazivom printer.c. 103 00:05:48,220 --> 00:05:50,910 Idemo ga pokrenuti s datotekom smo upravo stvorili - 104 00:05:50,910 --> 00:05:53,350 doc.txt. 105 00:05:53,350 --> 00:05:58,150 Ovaj program, kao što ime sugerira, jednostavno će ispisati sadržaj datoteke prošao na njega. 106 00:05:58,150 --> 00:06:00,230 I tu smo ga. 107 00:06:00,230 --> 00:06:03,780 Linije koda smo upisali ranije i spremiti u doc.txt. 108 00:06:03,780 --> 00:06:06,980 Bok. Moje ime je Jason. 109 00:06:06,980 --> 00:06:09,120 Ako ćemo zaroniti printer.c, 110 00:06:09,120 --> 00:06:13,570 vidimo da puno koda izgleda slično onome što smo samo prošetao u typewriter.c. 111 00:06:13,570 --> 00:06:16,720 Doista linija 22, gdje smo otvorili datoteku, 112 00:06:16,720 --> 00:06:19,220 i linija 39, gdje smo zatvorili datoteku, 113 00:06:19,220 --> 00:06:23,890 oba su gotovo identični typewriter.c, spremiti za fopen drugi argument. 114 00:06:23,890 --> 00:06:26,510 Ovaj put smo čitati iz datoteke, 115 00:06:26,510 --> 00:06:29,040 pa smo odabrali r umjesto w. 116 00:06:29,040 --> 00:06:31,950 Dakle, ajmo se fokusirati na drugom dijelu procesa. 117 00:06:31,950 --> 00:06:36,060 U skladu 35. kao drugi uvjet u naša 4 petlje, 118 00:06:36,060 --> 00:06:38,590 smo uputili poziv fgets, 119 00:06:38,590 --> 00:06:42,190 pratilac funkcija fputs od prije. 120 00:06:42,190 --> 00:06:44,660 Ovaj put imamo tri argumente. 121 00:06:44,660 --> 00:06:48,810 Prvi je pokazivač na niz znakova gdje je string će biti pohranjeni. 122 00:06:48,810 --> 00:06:52,670 Drugi je maksimalni broj znakova koje treba pročitati. 123 00:06:52,670 --> 00:06:56,010 I treći je pokazivač na datoteku s kojom smo radite. 124 00:06:56,010 --> 00:07:00,780 Primijetit ćete da je za petlje završava kada fgets vraća null. 125 00:07:00,780 --> 00:07:02,940 Postoje dva razloga da to može dogoditi. 126 00:07:02,940 --> 00:07:05,380 Prvo, možda je došlo do pogreške. 127 00:07:05,380 --> 00:07:10,740 Drugo, i više vjerojatno, kraj datoteke je postignut i nema više znakova su pročitali. 128 00:07:10,740 --> 00:07:14,040 U slučaju da se pitate, dvije funkcije ne postoje da nam dopustite da Vas 129 00:07:14,040 --> 00:07:17,160 koji je razlog uzrok za ovaj null pokazivač. 130 00:07:17,160 --> 00:07:21,090 I, ne iznenađuje, budući da oni imaju veze s rad s datotekama, 131 00:07:21,090 --> 00:07:26,940 oba ferror funkcija i početak feof funkcija sa slovom f. 132 00:07:26,940 --> 00:07:32,130 >> Konačno, prije nego što možemo zaključiti, jedan brzi bilješka o kraju datoteke funkcije, 133 00:07:32,130 --> 00:07:36,690 koji, kao što smo spomenuli, je napisan kao feof. 134 00:07:36,690 --> 00:07:41,550 Često ćete se naći pomoću a i za petlje da progresivno pročitati svoj put kroz datoteke. 135 00:07:41,550 --> 00:07:45,790 Dakle, morat ćete način do kraja ove petlje nakon što do kraja ove datoteke. 136 00:07:45,790 --> 00:07:50,510 Pozivanje feof na file pointer i provjere da li je to istina 137 00:07:50,510 --> 00:07:52,310 će učiniti upravo to. 138 00:07:52,310 --> 00:07:59,820 Dakle, dok se petlja s uvjetom (! Feof (fp)) može se činiti kao savršeno prikladno rješenje. 139 00:07:59,820 --> 00:08:03,770 Međutim, kažu imamo jednu liniju lijevo u našem tekstualnu datoteku. 140 00:08:03,770 --> 00:08:07,130 Mi ćemo ući u naš petlju dok i sve će raditi kao što je planirano. 141 00:08:07,130 --> 00:08:12,750 Na sljedećem krugu kroz naš program će provjeriti da li feof od fp je istina, 142 00:08:12,750 --> 00:08:15,430 ali - i to je ključna točka za razumijevanje ovdje - 143 00:08:15,430 --> 00:08:17,770 to neće biti istina samo još. 144 00:08:17,770 --> 00:08:21,110 To je zato što je svrha feof nije da provjerite 145 00:08:21,110 --> 00:08:24,400 ako je sljedeći poziv na čitanje funkciji će udariti kraj datoteke, 146 00:08:24,400 --> 00:08:28,190 nego da provjerite je li ili nije kraj datoteke već postignut. 147 00:08:28,190 --> 00:08:30,140 U ovom slučaju, primjerice, 148 00:08:30,140 --> 00:08:32,780 čitajući zadnju liniju našeg datoteku ide savršeno glatko, 149 00:08:32,780 --> 00:08:36,210 ali program još uvijek ne zna da smo pogodak kraj našeg datoteku. 150 00:08:36,210 --> 00:08:40,549 To nije sve što čini jedan dodatni pročitao da to uzvraća na kraju datoteke. 151 00:08:40,549 --> 00:08:43,210 Dakle, točno stanje će biti sljedeći: 152 00:08:43,210 --> 00:08:49,330 fgets i njegove tri argumenti - izlaz, veličina outputa, i FP - 153 00:08:49,330 --> 00:08:52,570 i sve to nije jednak null. 154 00:08:52,570 --> 00:08:55,260 To je pristup koji smo uzeli printer.c, 155 00:08:55,260 --> 00:08:57,890 i, u ovom slučaju, nakon petlje izlaza, 156 00:08:57,890 --> 00:09:04,290 što bi se moglo nazvati feof ili ferror obavijestiti korisnika kao na određenu obrazloženju izlaska ovu petlju. 157 00:09:04,290 --> 00:09:08,100 >> Pišući i čitanje iz datoteke, u svom najosnovnijem, 158 00:09:08,100 --> 00:09:10,150 jednostavna 3-dio procesa. 159 00:09:10,150 --> 00:09:12,530 Prvo, mi otvoriti datoteku. 160 00:09:12,530 --> 00:09:16,740 Drugo, mi staviti neke stvari u našoj datoteci ili poduzeti neke stvari iz nje. 161 00:09:16,740 --> 00:09:19,200 Treće, zatvorite datoteku. 162 00:09:19,200 --> 00:09:21,170 Prvi i zadnji dijelovi su lako. 163 00:09:21,170 --> 00:09:23,920 Srednji dio gdje je lukav stvar leži. 164 00:09:23,920 --> 00:09:27,760 I premda se ispod haube smo uvijek bave dugog niza nula i one, 165 00:09:27,760 --> 00:09:30,710 to ne pomaže kada kodiranja dodati sloj apstrakcije 166 00:09:30,710 --> 00:09:35,350 koji pretvara slijed u nešto što više sliči ono što smo navikli vidjeti. 167 00:09:35,350 --> 00:09:39,570 Na primjer, ako radimo s 24-bitnom bitmap datoteku, 168 00:09:39,570 --> 00:09:43,290 smo vjerojatno ćete biti čitanje ili pisanje triju bajtova na vrijeme. 169 00:09:43,290 --> 00:09:46,450 U tom slučaju, to bi imalo smisla da definiramo i prikladno ime 170 00:09:46,450 --> 00:09:48,980 struct koji je tri bajta veliki. 171 00:09:48,980 --> 00:09:51,410 >> Iako rad s datotekama može činiti komplicirano, 172 00:09:51,410 --> 00:09:54,530 ih koriste nam omogućuje da učinite nešto zaista izvanredan. 173 00:09:54,530 --> 00:09:58,880 Mi možemo promijeniti stanje u svijetu izvan našeg programa, 174 00:09:58,880 --> 00:10:01,730 možemo stvoriti nešto što živi izvan života našeg programa, 175 00:10:01,730 --> 00:10:07,190 ili možemo čak promijeniti nešto što je nastalo prije naš program počeo prikazivati. 176 00:10:07,190 --> 00:10:11,210 Interakcija s datotekama je doista moćan dio programa u C. 177 00:10:11,210 --> 00:10:15,300 i ja sam uzbuđen vidjeti što ćeš napraviti s njom u kodu da dođe. 178 00:10:15,300 --> 00:10:19,770 Moje ime je Jason Hirschhorn. Ovo je CS50. 179 00:10:19,770 --> 00:10:21,770 [CS50.TV] 180 00:10:21,770 --> 00:10:25,940 >> [Smijeh] 181 00:10:25,940 --> 00:10:29,330 Ok. Jedan poduzeti. Ovdje ćemo ići. 182 00:10:49,000 --> 00:10:52,140 Kada mislimo datoteku - >> Oh, čekajte. Oprostite. 183 00:10:52,140 --> 00:10:56,800 [Smijeh] Ok. 184 00:11:06,620 --> 00:11:09,970 Hej tamo. 185 00:11:13,670 --> 00:11:16,310 Kada mislimo datoteku - 186 00:11:17,610 --> 00:11:20,710 Kada mislite datoteku - Ok. Recite mi kad ste spremni. 187 00:11:20,710 --> 00:11:22,520 Oh, sjajno. 188 00:11:22,520 --> 00:11:26,180 Iako čitanje iz teleprompter može činiti - nema. Moj loše.