[Powered by Google Translate] [Datoteke I / O] [Jason Hirschhorn, Harvard University] [To je CS50, CS50.TV] Ko razmišljamo o datoteki, kar pride na misel, je Microsoft Word dokument, JPEG ali MP3 song, in smo interakcijo z vsako od teh vrst datotek na različne načine. Na primer, v Wordovem dokumentu bomo dodali besedilo medtem ko se v JPEG sliko bomo morda obrezati iz robov ali retuširanje barve. Vendar pod pokrovom vse datoteke na našem računalniku, niso nič bolj od dolgega zaporedja ničel in enic. To je do posebne vloge, ki sodeluje z datoteko odločiti, kako obdelati dolgo zaporedje in ga predstaviti vsem uporabnikom. Po eni strani lahko dokument ogledate na samo en bajt, ali 8 ničel in enic in prikazati ASCII znak na zaslonu. Po drugi strani pa se lahko bitna slika ogledate na 3 bajte, ali 24 ničel in enic, in jih razlagati kot 3 šestnajstiških številk da so vrednosti za rdeče, zelene in modre v enem pixel slike. Karkoli lahko videti na zaslonu, v svojem bistvu, Datoteke niso nič več kot zaporedje ničel in enic. Torej se potopite v in poglej kako dejansko spreminjanja teh ničel in enic ko gre za pisno in branje iz datoteke. Začela bom, da ga razbije na preprost 3-del procesa. Naslednja, bom se potopite v dveh oznako primerov, ki dokazujejo te tri dele. Končno bom pregledala postopek in nekaterih njegovih najpomembnejših informacij. Kot pri vseh datotek, ki sedi na namizju prva stvar je, da se odpre. C to storimo tako, da razglasi kazalec na vnaprej struct , ki predstavlja datoteko na disku. V tem klicu funkcije, prav tako odločiti, ali želimo pisati ali brati iz datoteke. Nato, bomo dejansko branje in pisanje. Obstajajo številne specializirane funkcije lahko uporabite v tem delu, in skoraj vse izmed njih začne s črko F, ​​ki stoji za datoteko. Zadnja, podobno drobnih rdečih X v zgornjem desnem kotu datotek odpre na vašem računalniku, zapremo datoteko s klicem končno funkcijo. Zdaj, ko imamo splošno predstavo o tem, kaj bomo storili, dajmo se potopite v kodo. V tej mapi imamo dve C datotek in njihove ustrezne izvršilne datoteke. Pisalni stroj program traja en argument v ukazni vrstici, ime dokumenta želimo ustvariti. V tem primeru, bomo rekli doc.txt. Naj zaženite program in vnesite nekaj vrstic. Pozdravljeni. Moje ime je Jason. Na koncu bomo vpišite "zaprete". Če bomo zdaj seznam vseh datotek v tem imeniku, vidimo, da obstaja nov dokument, imenovan doc.txt. To je datoteka ta program pravkar ustvarili. In seveda, tudi ni nič več kot dolgega zaporedja ničel in enic. Če bomo odprli to novo datoteko, vidimo 3 vrstic kode smo vnesli v naš program - Pozdravljeni. Maj je ime Jason. Toda kaj se dejansko dogaja, ko typewriter.c teče? V prvi vrstici pomena za nas je linija 24. V skladu s tem izjavljamo, naš datotečnega kazalca. Funkcija, ki vrne kazalec this, fopen, traja dva argumenta. Prvi je ime datoteke vključno s pripono, če je to primerno. Spomnimo se, da končnica ne vpliva na sliko na najnižji ravni. Vedno smo se ukvarjajo z dolgo zaporedje ničel in enic. Vendar pa to ne vpliva, kako so datoteke razlagati in za kaj se uporablja aplikacije za odpiranje vrat. Drugi argument za fopen je ena črka ki se zavzema za to, kaj nameravate storiti potem, ko smo datoteko odpreti. Obstajajo tri možnosti za to trditev - W, R, in A. Mi smo izbrali w v tem primeru, ker želimo pisati v datoteko. R, kot ste verjetno uganili, je za branje v datoteko. In je za dodajanje sporočil v datoteko. Medtem ko sta w in se lahko uporablja za pisanje v datoteke, w bo začel pisati od začetka datoteke in potencialno prepišete vse podatke, ki so že bili shranjeni. Privzeto je datoteka se nam odpre, če ne obstaja, ustvarjen v naši sedanji delovni imenik. Vendar, če želimo, da odprete ali ustvarite datoteko na drugo mesto, V prvem argumentu fopen, smo lahko določite pot do datoteke, poleg imena datoteke. Medtem ko je prvi del tega procesa je le ena vrstica kode dolgo, to je vedno dobra praksa, da se vključi še en niz vrstic da preveri, ali je bila datoteka uspešno odprli ali ustvarili. Če fopen vrne null, si ne bi želel, da korak naprej v našem programu, in to lahko zgodi, če je operacijski sistem iz spomina ali če se želimo odpreti datoteke v imenike, za katere nismo imeli ustreznih dovoljenj. Drugi del procesa poteka, medtem ko pisalnim strojem zanke. Mi uporabljamo CS50 knjižnično funkcijo, da bi dobili prispevek od uporabnika, in ob predpostavki, da ne želijo zapustiti programa, bomo uporabili funkcijo fputs naj niz in pisati, da v spis. fputs je le ena od mnogih funkcij, da bi nam pisati v datoteko. Drugi so fwrite, fputc in celo ovrednotenj. Ne glede na določene funkcije smo na koncu z uporabo, čeprav vsi vedeti, prek svojih argumentov, vsaj dve stvari - kaj je treba pisno in v katerih mora biti napisana na. V našem primeru, vhod je niz, ki mora biti napisana fp in je kazalec, ki nas usmerja tja, kjer smo pisanje. V tem programu, drugi del tega procesa je dokaj enostavna. Mi smo le ob vrvico od uporabnika in ga dodate na naš datoteko z malo-to-ni vhod preverjanje, ali varnostna preverjanja. Pogosto pa se bo v drugem delu prevzel večji del kode. Končno, tretji del je na liniji 58, kjer smo zaprite datoteko. Tu pravimo fclose in jih prenesti našo prvotno kazalec datoteke. V naslednji vrstici se vrnemo nič, signalizacija konec našega programa. In, ja, tretji del je tako enostavno, kot to. Pojdimo k branju iz datoteke. Nazaj v našem imamo datoteko imenovano printer.c. Naj ga zaženite z datoteko pravkar ustvarili - doc.txt. Ta program, kot že ime pove, bo preprosto izpiše vsebino datoteke prenesejo nanjo. In tam jo imamo. Vrstic kode smo vnesli prej in shrani v doc.txt. Pozdravljeni. Moje ime je Jason. Če se spustimo v printer.c, vidimo, da je videti veliko kode podobno temu, kar smo pravkar vstopil skozi v typewriter.c. Dejansko linija 22, kjer smo odprli datoteko, in linija 39, kjer je zaključil spis, sta skoraj identična typewriter.c, razen za fopen drugega argumenta. Tokrat smo branje iz datoteke, Tako smo se odločili, namesto r w. Tako, dajmo osredotočiti na drugem delu procesa. V skladu 35, kot drugi pogoj iz našega 4 zanke, smo klic, da fgets, spremljevalec funkcijo fputs od prej. Tokrat imamo tri argumente. Prvi je kazalec na niz znakov, kjer bodo shranjeni niz. Drugi je največje število znakov, ki jih je treba brati. In tretja je kazalec na datoteko, s katerimi delamo. Opazili boste, da se zanka konča, ko fgets vrne null. Obstajata dva razloga, da se je to lahko zgodilo. Prvič, lahko prišlo do napake. Drugič, in bolj verjetno je bil konec datoteke dosežen in ni več znakov, je bilo brati. V primeru, da ste se spraševala, dve funkciji ne obstajajo, da nam omogočajo, da povem Razlog, ki je vzrok za to posebno kazalca null. In, kar ni presenetljivo, saj ima to opraviti z delo z datotekami, tako fError funkcijo in funkcijo start feof s črko f. Končno, preden zaključimo, eno kratko opozorilo o izteku delovanja datoteke ki je, kot že omenjeno, je zapisan kot feof. Pogosto boste znašli z uporabo while in for zanke postopoma prebral svojo pot skozi datotek. Tako boste morali način za končanje te zanke ko pridete do konca teh datotek. Klicanje feof na datotečni kazalec in preverjanje, da vidim, če je res bi storil prav to. Tako si lahko, medtem ko zanka s pogojem (! Feof (fp)) zdi popolnoma ustrezno rešitev. Vendar pravijo, da imamo eno vrstico, ki je ostala v našem besedilno datoteko. Bomo vstopijo v našo while zanko, pa bo vse izšlo po načrtih. V naslednjem krogu skozi, bo naš program preverite, če feof FP je res, ampak - in to je ključna točka tukaj razumeti - da ne bo res samo še. To je zato, ker je namen feof ni za pregled če bo naslednji razpis za branje funkcijo hit konec datoteke ampak za preverjanje, ali je konec datoteke že dosežena. Pri tem na primer, branje zadnjo linijo našega spisa gre odlično gladko, vendar program še ne ve, da smo zadeli konec naše datoteke. Ne, dokler se ne eno dodatno branje, ki jih števci koncu datoteke. Tako bi pravilno stanje, so naslednji: fgets in njegove tri trditve - proizvodnja, obseg proizvodnje in fp - in vsi, ki ni enaka null. To je pristop, ki smo vzel v printer.c, in v tem primeru, potem ko zanke izhodov, lahko bi rekli feof ali fError obvestiti uporabnika, da se posebne obrazložitve za izhod iz te zanke. Pisanje in branje iz datoteke je na najbolj osnovno, preprost 3-del procesa. Najprej smo odpreti. Drugič, dal nekaj stvari v naši datoteke ali pa nekaj stvari od njega. Tretjič, zaprite datoteko. Prvi in ​​zadnji deli so enostavno. Osrednji del je, če je zahtevna stvar leži. In čeprav pod pokrovom smo vedno ukvarjajo z dolgo zaporedje ničel in enic, to ne pomaga pri kodiranju dodati plast abstrakcije da spremeni vrstni red v nekaj, kar je bolj podobno, kar smo vajeni. Na primer, če delamo z 24-bitno datoteko bitne slike, bomo verjetno branjem ali zapisovanjem 3 bajte naenkrat. V tem primeru bi bilo smiselno opredeliti in ustrezno poimenovanje struct, ki je 3 biti velik. Čeprav lahko delo z datotekami zdi zapleteno, njihovo uporabo nam omogoča, da narediš nekaj resnično izjemen. Mi lahko spremenite stanje sveta zunaj našega programa, bomo lahko ustvarili nekaj, kar živi dlje od trajanja našega programa, ali lahko sploh kaj spremeniti, ki je nastal pred naš program začeli izvajati. Interakcija z datotekami je resnično močna del programov v C. in sem navdušena, da vidite, kaj boste ustvarili z njim v kodo, ki prihaja. Moje ime je Jason Hirschhorn. To je CS50. [CS50.TV] [Smeh] Ok. Ena sprejeti. Pa gremo. Ko razmišljamo o datoteki - >> Oh, počakaj. Žal mi je. [Smeh] V redu. Pozdravljeni. Ko razmišljamo o datoteki - Če menite, da datoteke - Ok. Povej mi, ko boš pripravljen. Oh, super. Čeprav je branje iz teleprompter se morda zdi - ni. Moja napaka.