[Powered by Google Translate] [File I / O] [Jason Hirschhorn, Sveučilište Harvard] [Ovo je CS50, CS50.TV] Kada mislimo datoteke, što padne na pamet je dokument Microsoft Word, JPEG slika ili MP3 pjesma, i mi komunicirati sa svaki od tih tipova datoteka u različite načine. Na primjer, u dokumentu programa Word smo dodali tekst dok je sa JPEG slike možemo izrezivati ​​iz rubova ili retuširati boje. Ipak, ispod haube sve datoteke u naše računalo nisu ništa više od dugog niza nula i one. To je do određene aplikacije koja komunicira s datotekom odlučiti kako će obraditi ovaj dugo slijed i prezentirati ga na korisnika. S jedne strane, dokument može pogledati samo jednom bajtu, ili osam nula i one, i prikazati ASCII znaka na zaslonu. S druge strane, skenirana slika može pogledati tri bajtovima, ili 24 nula i one, i tumačiti ih kao tri heksadecimalni brojevi koji predstavljaju vrijednosti za crvenu, zelenu i plavu u jednom pikselu od slike. Što god oni svibanj izgledati na zaslonu, na svom srcu, Datoteke nisu ništa više od niza nula i one. Dakle, neka je roniti i gledati kako mi zapravo manipulirati tih nula i one kada je u pitanju pisanja i čitanja iz datoteke. Počet ću ga razbijanje na jednostavan 3-dio procesa. Dalje, ja ću zaroniti u dvije kod primjera koji pokazuju ove tri dijela. Konačno, ja ću pregledati proces, a neke od njegovih najvažnijih detalja. Kao i kod bilo koje datoteke koji sjedi na radnoj površini, prva stvar za učiniti je da ga otvorite. U C činimo to proglašavajući pokazivač na predefinirane struct koji predstavlja datoteku na disk. U tom funkcijom poziva, mi također odlučiti hoće li želimo pisati ili čitati iz datoteke. Dalje, mi stvarni čitanje i pisanje. Postoji nekoliko specijaliziranih funkcija možemo koristiti u ovom dijelu, a gotovo svi od njih početi s slovom F, koja se zalaže za datoteku. Posljednja, srodan malim crvenim X u gornjem kutu datoteka otvoriti na računalu, smo zatvorili datoteku s konačnim funkcije poziva. Sada kada imamo opću ideju o tome što ćemo učiniti, ajmo uronite u kodu. U ovom imeniku, imamo dva C datoteke i njihove odgovarajuće izvršne datoteke. Pisaći stroj Program traje jedan argument naredbenog retka, naziv dokumenta želimo stvoriti. U tom slučaju, mi ćemo ga zovu doc.txt. Ajmo pokrenuti program i unesite nekoliko redaka. Bok. Moje ime je Jason. Konačno, mi ćemo upisati "zatvoriti". Ako mi sada popis svih datoteka u tom direktoriju, vidimo da novi dokument postoji zove doc.txt. To je datoteka ovaj program upravo stvorili. I naravno, to je previše je ništa više od dugog niza nula i one. Ako smo otvorili ovu novu datoteku, vidimo tri linije koda smo ušli u našem programu - Bok. Svibanj ime je Jason. No, ono što se zapravo događa kada typewriter.c radi? U prvom redu od interesa za nas je linija 24. U skladu s tim, mi iskazujemo svoju pokazivač datoteke. Funkcija koja vraća ovaj pokazivač, fopen, uzima dva argumenta. Prvi je naziv datoteke, uključujući ekstenzijom ako je potrebno. Podsjetimo da ekstenzija datoteke ne utječe na sliku na najnižoj razini. Uvijek smo se bave dugog niza nula i one. No, to ne utječe kako su datoteke tumačiti i ono aplikacije koriste ih otvoriti. Drugi argument za fopen je slovo koja se zalaže za ono što planiramo učiniti nakon što smo otvorili datoteku. Postoje tri opcije za ovaj argument - W, R, i A. Odabrali smo w u ovom slučaju, jer želimo pisati u datoteku. R, kao što vjerojatno možete pogoditi, je za čitanje u datoteci. A je za dodavanje u datoteku. Iako su obje w i može se koristiti za pisanje u datoteke, w će početi pisati od početka datoteke i potencijalno prepisati sve podatke koji su prethodno pohranjeni. Po defaultu, datoteka smo otvorili, ako već ne postoji, se stvara u našem sadašnjem radnom direktoriju. Međutim, ako želimo pristup ili stvoriti datoteku u nekom drugom mjestu, u prvom argumentu fopen, možemo odrediti put datoteke uz ime datoteke. Dok je prvi dio ovog procesa je samo jedna linija koda dugo, to je uvijek dobra praksa da su drugi set linija da provjerite da li je datoteka uspješno otvorena je ili urednik. Ako fopen vraća null, ne bismo željeli da krivotvoriti naprijed s našim programom, a to se može dogoditi ako se operativni sustav je iz memorije ili ako ćemo pokušati otvoriti datoteku u direktorij za koje nismo imali odgovarajuće dozvole. Dio dva procesa odvija u pisaći stroj je while petlje. Mi koristimo CS50 knjižnice funkciju kako bi dobili informacije od korisnika, i uz pretpostavku da se ne žele prestati program, mi koristimo funkcijske fputs uzeti string i napisati ga u datoteku. fputs je samo jedan od mnogih funkcija možemo koristiti za pisanje u datoteku. Drugi su fwrite, fputc, pa čak i fprintf. Bez obzira na određene funkcije možemo završiti koristeći, ipak, sve njih treba znati, putem svojih argumenata, najmanje dvije stvari - ono što treba biti napisano i gdje to treba biti napisan. U našem slučaju, ulaz je niz koji treba biti napisan a fp je pokazivač koji nas usmjerava tamo gdje pišemo. U ovom programu, dio dva procesa je prilično jednostavan. Mi jednostavno uzimanje niz od korisnika i dodao izravno na našoj datoteci s malo-to-nema ulaz validacija ili sigurnosne provjere. Često, međutim, dio njih će dvoje zauzimaju najveći dio svog koda. Konačno, dio tri je na liniji 58, gdje ćemo zatvoriti datoteku. Ovdje zovemo fclose i to prođe naš izvorni datotečni pokazivač. U sljedećem retku, vraćamo nula, signalizirajući kraj našeg programa. I, da, dio tri je kao jednostavan kao taj. Idemo na čitanje iz datoteke. Povratak u našem imeniku imamo datoteku pod nazivom printer.c. Idemo ga pokrenuti s datotekom smo upravo stvorili - doc.txt. Ovaj program, kao što ime sugerira, jednostavno će ispisati sadržaj datoteke prošao na njega. I tu smo ga. Linije koda smo upisali ranije i spremiti u doc.txt. Bok. Moje ime je Jason. Ako ćemo zaroniti printer.c, vidimo da puno koda izgleda slično onome što smo samo prošetao u typewriter.c. Doista linija 22, gdje smo otvorili datoteku, i linija 39, gdje smo zatvorili datoteku, oba su gotovo identični typewriter.c, spremiti za fopen drugi argument. Ovaj put smo čitati iz datoteke, pa smo odabrali r umjesto w. Dakle, ajmo se fokusirati na drugom dijelu procesa. U skladu 35. kao drugi uvjet u naša 4 petlje, smo uputili poziv fgets, pratilac funkcija fputs od prije. Ovaj put imamo tri argumente. Prvi je pokazivač na niz znakova gdje je string će biti pohranjeni. Drugi je maksimalni broj znakova koje treba pročitati. I treći je pokazivač na datoteku s kojom smo radite. Primijetit ćete da je za petlje završava kada fgets vraća null. Postoje dva razloga da to može dogoditi. Prvo, možda je došlo do pogreške. Drugo, i više vjerojatno, kraj datoteke je postignut i nema više znakova su pročitali. U slučaju da se pitate, dvije funkcije ne postoje da nam dopustite da Vas koji je razlog uzrok za ovaj null pokazivač. I, ne iznenađuje, budući da oni imaju veze s rad s datotekama, oba ferror funkcija i početak feof funkcija sa slovom f. Konačno, prije nego što možemo zaključiti, jedan brzi bilješka o kraju datoteke funkcije, koji, kao što smo spomenuli, je napisan kao feof. Često ćete se naći pomoću a i za petlje da progresivno pročitati svoj put kroz datoteke. Dakle, morat ćete način do kraja ove petlje nakon što do kraja ove datoteke. Pozivanje feof na file pointer i provjere da li je to istina će učiniti upravo to. Dakle, dok se petlja s uvjetom (! Feof (fp)) može se činiti kao savršeno prikladno rješenje. Međutim, kažu imamo jednu liniju lijevo u našem tekstualnu datoteku. Mi ćemo ući u naš petlju dok i sve će raditi kao što je planirano. Na sljedećem krugu kroz naš program će provjeriti da li feof od fp je istina, ali - i to je ključna točka za razumijevanje ovdje - to neće biti istina samo još. To je zato što je svrha feof nije da provjerite ako je sljedeći poziv na čitanje funkciji će udariti kraj datoteke, nego da provjerite je li ili nije kraj datoteke već postignut. U ovom slučaju, primjerice, čitajući zadnju liniju našeg datoteku ide savršeno glatko, ali program još uvijek ne zna da smo pogodak kraj našeg datoteku. To nije sve što čini jedan dodatni pročitao da to uzvraća na kraju datoteke. Dakle, točno stanje će biti sljedeći: fgets i njegove tri argumenti - izlaz, veličina outputa, i FP - i sve to nije jednak null. To je pristup koji smo uzeli printer.c, i, u ovom slučaju, nakon petlje izlaza, što bi se moglo nazvati feof ili ferror obavijestiti korisnika kao na određenu obrazloženju izlaska ovu petlju. Pišući i čitanje iz datoteke, u svom najosnovnijem, jednostavna 3-dio procesa. Prvo, mi otvoriti datoteku. Drugo, mi staviti neke stvari u našoj datoteci ili poduzeti neke stvari iz nje. Treće, zatvorite datoteku. Prvi i zadnji dijelovi su lako. Srednji dio gdje je lukav stvar leži. I premda se ispod haube smo uvijek bave dugog niza nula i one, to ne pomaže kada kodiranja dodati sloj apstrakcije koji pretvara slijed u nešto što više sliči ono što smo navikli vidjeti. Na primjer, ako radimo s 24-bitnom bitmap datoteku, smo vjerojatno ćete biti čitanje ili pisanje triju bajtova na vrijeme. U tom slučaju, to bi imalo smisla da definiramo i prikladno ime struct koji je tri bajta veliki. Iako rad s datotekama može činiti komplicirano, ih koriste nam omogućuje da učinite nešto zaista izvanredan. Mi možemo promijeniti stanje u svijetu izvan našeg programa, možemo stvoriti nešto što živi izvan života našeg programa, ili možemo čak promijeniti nešto što je nastalo prije naš program počeo prikazivati. Interakcija s datotekama je doista moćan dio programa u C. i ja sam uzbuđen vidjeti što ćeš napraviti s njom u kodu da dođe. Moje ime je Jason Hirschhorn. Ovo je CS50. [CS50.TV] [Smijeh] Ok. Jedan poduzeti. Ovdje ćemo ići. Kada mislimo datoteku - >> Oh, čekajte. Oprostite. [Smijeh] Ok. Hej tamo. Kada mislimo datoteku - Kada mislite datoteku - Ok. Recite mi kad ste spremni. Oh, sjajno. Iako čitanje iz teleprompter može činiti - nema. Moj loše.