[Powered by Google Translate] [Súbor I / O] [Jason Hirschhorn, Harvard University] [To je CS50, CS50.TV] Keď si myslíme, že o súbore, čo príde na myseľ, je dokument programu Microsoft Word, obrázok JPEG, alebo MP3 song, a sme v kontakte s každou z týchto typov súborov rôznymi spôsobmi. Napríklad, v dokumente programu Word sa pridať text zatiaľ čo pri formáte JPEG môžeme odstrihnúť hrany alebo retušovať farby. Napriek tomu pod kapotou všetkých súborov v našom počítači nie sú nič viac ako dlhé postupnosti núl a jedničiek. Je to na konkrétnu aplikáciu, ktorá spolupracuje so súborom rozhodnúť, ako spracovať tento dlhý sled a predloží ho pre užívateľa. Na jednej strane, môže dokument vyzerať na jedinom bajtu, alebo 8 núl a jedničiek, a zobrazí ASCII znak na obrazovke. Na druhej strane, môže byť rastrový obrázok sa na 3 bajty, alebo 24 núl a jedničiek, a interpretovať ich ako 3 hexadecimálnych čísel ktoré predstavujú hodnoty pre červenú, zelenú a modrú farbu v jednom pixel obrazu. Nech oni môžu vyzerať ako na obrazovke, vo svojej podstate, Súbory nie sú nič viac ako sled núl a jedničiek. Takže poďme ponoriť a pozrieť sa na to, ako sme vlastne manipulácii s týmito núl a jedničiek pokiaľ ide o písanie a čítanie zo súboru. Začnem tým, že rozbije ho do jednoduchého 3-časť procesu. Ďalej budem ponoriť do dvoch príkladoch kódu, ktoré ukazujú tieto tri časti. Nakoniec, ja prehodnotiť proces a niektoré z jeho najdôležitejších detailov. Rovnako ako u akéhokoľvek súboru, ktorý sedí na ploche, Prvá vec, ktorú musíte urobiť, je otvoriť. V jazyku C sme to tým, že deklaruje ukazovateľ na struct vopred , Ktorý predstavuje súbor na disku. V tomto volanie funkcie, sme tiež rozhodnúť, či chceme písať alebo čítať zo súboru. Ďalej sme robiť skutočné čítanie a písanie. Existuje celý rad špecializovaných funkcií sa môžu použiť v tejto časti, a takmer všetci z nich začať s písmenom F, čo je skratka pre súbor. Posledná, podobný na malé červené X v hornom rohu súborov otvoriť na vašom počítači, zavrieme súbor s konečnou volanie funkcie. Teraz, keď máme všeobecnú predstavu o tom, čo budeme robiť, Poďme sa ponoriť do kódu. V tomto adresári, máme dve C súbory a ich zodpovedajúce spustiteľné súbory. Písací stroj Program trvá jeden argument príkazového riadku, názov dokumentu chceme vytvoriť. V tomto prípade, budeme nazývať Doc.txt. Poďme spustiť program a zadať pár riadkov. Ahoj. Moje meno je Jason. Nakoniec, budeme písať "quit". Ak by sme teraz vypísať všetky súbory v tomto adresári, vidíme, že nový dokument existuje tzv Doc.txt. To je súbor tohto programu práve vytvorili. A samozrejme, je tiež nič viac, než dlhé postupnosti núl a jedničiek. Ak sme sa otvoriť tento nový súbor, vidíme 3 riadky kódu sme vstúpili do nášho programu - Ahoj. May meno je Jason. Ale čo sa vlastne deje, keď typewriter.c beží? Prvý riadok záujmu je pre nás linka 24. V tomto riadku, prehlasujeme, že náš ukazovateľ súboru. Funkcia, ktorá vracia tento ukazovateľ, fopen, vyžaduje dva argumenty. Prvý je názov súboru vrátane prípony súboru v prípade potreby. Pripomeňme si, že prípona neovplyvňuje súbor na najnižšej úrovni. Sme vždy riešenie s dlhou sekvenciu núl a jedničiek. Ale to predsa vplyv, ako sú súbory interpretované a aké aplikácie sú používané k otvoreniu je. Druhý argument funkcie fopen je jedno písmeno , Ktoré stoja za to, čo chceme robiť, keď sme otvorení súboru. Existujú tri možnosti pre tento argument - W, R, a A. Vybrali sme w v tomto prípade, pretože chceme zapisovať do súboru. R, ako asi tušíte, je pre čítanie súboru. A je pre pridanie do súboru. Aj keď ako w a môžu byť použité pre zápis do súborov, w začína od začiatku súboru a potenciálne prepísať všetky dáta, ktoré boli predtým uložené. V predvolenom nastavení je súbor otvárame, ak už neexistuje, je vytvorený v našom súčasnom pracovnom adresári. Avšak, ak chceme získať prístup, alebo vytvoriť súbor v inom mieste, v prvom argumente fopen, môžeme zadať cestu k súboru okrem názvu súboru. Zatiaľ čo prvá časť tohto procesu je len jeden riadok kódu dlhé, je to vždy dobré praxe o ďalšiu sadu čiar že presvedčte sa, že súbor bol úspešne otvorený alebo vytvorený. Ak fopen vráti null, by sme nechceli vpred s naším programom, ak tomu môže dôjsť v prípade, že operačný systém je z pamäte alebo ak sa pokúsite otvoriť súbor v adresári, pre ktoré sme nemali príslušné oprávnenie. Druhá časť procesu prebieha v písacieho stroja, zatiaľ čo slučky. Používame CS50 knižnice funkciu získať vstup od užívateľa, a za predpokladu, že nechcú opustiť program, sme použiť funkciu fputs, aby reťazec a zapíše ich do súboru. fputs je iba jedným z mnohých funkcií by sme mohli použiť na zápis do súboru. Iní zahŕňajú fwrite, fputc, a dokonca aj fprintf. Bez ohľadu na konkrétnu funkciu sme skončiť s použitím, i keď, všetky z nich potrebujete vedieť, prostredníctvom svojich argumentov, aspoň dve veci - čo treba písomná a ak je potrebné zapisovať. V našom prípade, vstup je reťazec, ktorý musí byť písomný a fp je ukazovateľ, ktorý smeruje nás k miestu, kde sme písať. V tomto programe, druhá časť procesu je pomerne jednoduché. Sme jednoducho vezme reťazec od užívateľa a pridaním priamo do nášho súboru s málo-to-no overovanie vstupu alebo bezpečnostné kontroly. Často sa však bude druhá časť zaberajú väčšinu kódu. Konečne, tretia časť je on-line 58, kde sme zatvorte súbor. Tu hovoríme fclose a odovzdať ju náš pôvodný súbor ukazovateľ. V nasledujúcom linke, vráti nulu, signalizujúce koniec nášho programu. A, áno, tretia časť je tak jednoduché. Poďme na čítanie zo súborov. Späť v našom adresári máme súbor s názvom printer.c. Poďme spustiť so súborom sme práve vytvorili - Doc.txt. Tento program, ako už názov napovedá, bude jednoducho vytlačiť z obsahu spisu odovzdané. A tu to máme. Riadky kódu sme písali skôr a uložené v doc.txt. Ahoj. Moje meno je Jason. Ak sa ponoríme do printer.c, vidíme, že veľa kódu vyzerá podobne ako to, čo sme práve prešli v typewriter.c. Naozaj riadok 22, kde sme otvorili súbor, a linka 39, kde sme uzavreli súbor, tak takmer totožné s typewriter.c, s výnimkou fopen druhý argument. Tentoraz sme čítanie zo súboru, takže sme sa rozhodli r miesto w. Tak, zamerajme na druhej časti procesu. V potrubí 35, ako druhý stav v našom 4 slučke, ak sme volať do fgets, spoločník funkciu fputs z pred. Tentoraz máme tri argumenty. Prvým z nich je ukazovateľ na pole znakov, kde reťazec bude uložená. Druhým je maximálny počet znakov, ktoré sa čítať. A tretí je ukazovateľ na súbor, s ktorými pracujete. Určite ste si všimli, že na slučke končí, keď fgets vráti null. Existujú dva dôvodom, že toto môže stať. Po prvé, môže dôjsť k chybe. Po druhé, a väčšia pravdepodobnosť, bol koniec súboru dosiahla a nie viac znakov boli čítané. V prípade, že ste premýšľal, dve funkcie existujú, ktoré nám umožní povedať z tohto dôvodu je príčinou tohto konkrétneho null ukazovateľ. A nie je divu, pretože majú čo do činenia s prácu so súbormi, ako fError funkcie a funkcie feof štart s písmenom f Napokon, pred tým, než k záveru, jedna rýchla zmienka o koniec súboru funkcií, ktorá, ako bolo práve uvedené, je písaný ako feof. Často zistíte, sami pomocou while a for slučky postupne prečítať si cestu cez súbory. Tak, budete potrebovať spôsob, ako ukončiť tieto slučky po dosiahnutí konca týchto súborov. Volanie feof na súborovom ukazovateľ a kontrola, či je to pravda by robiť len to. Tak môže while s podmienkou (! Feof (fp)) javí ako dokonale vhodného riešenia. Avšak, že máme jeden riadok vľavo v našom textovom súbore. Budeme vstúpi do nášho while a všetko bude fungovať tak, ako sa plánovalo. Na ďalšom kole cez, bude náš program skontroluje, či feof FP je pravda, ale - a to je kľúčový bod k pochopeniu tu - to nebude pravda zatiaľ. To je preto, že cieľom feof nie je kontrolovať ak ďalšie volania o prečítaní funkcii bude hit koniec súboru, , Ale skôr overiť, či je alebo nie je koniec súboru už bolo dosiahnuté. V prípade tohto príkladu, čítanie posledný riadok našom súbore ide plynule, ale program ešte nevie, že sme narazila na koniec nášho súboru. Nie je to až to robí jednu dodatočnú čítal že čítače konci súboru. Tak, správne podmienka je nasledujúci: fgets a jeho tri argumenty - výstup, veľkosť výstupu, a fp - a to všetko nie je rovná null. Tento prístup je sme sa v printer.c, a v tomto prípade sa po slučky východom, by sa dalo nazvať feof alebo fError informovať užívateľa, pokiaľ ide o osobitné argumentácie pre ukončenie tejto slučky. Písanie a čítanie zo súboru, je na jeho najzákladnejšie, Jednoduchý 3-dielna proces. Po prvé, sme sa otvoriť súbor. Po druhé, sme dať nejaké veci do nášho súboru alebo sa niektoré veci z neho. Po tretie, zavrieme súbor. Prvé a posledné časti sú jednoduché. Prostredná časť je miesto, kde chúlostivé veci spočíva. A aj keď pod kapotou sme vždy riešenie s dlhou sekvenciu núl a jednotiek, to pomôže pri kódovaní pridať vrstvu abstrakcie , Ktorý zmení poradie na niečo, čo viac podobá, čo sme zvyknutí vídať. Napríklad, ak budeme pracovať s 24-bitový bitmapový súbor, budeme pravdepodobne pri čítaní alebo zápise tri bajty naraz. V takom prípade, by to zmysel definovať a vhodne pomenovať struct, ktorý je 3 bajty veľký. Hoci práca so súbormi môže zdať zložité, využitie je nám umožňuje urobiť niečo naozaj pozoruhodný. Môžeme zmeniť stav sveta mimo našu programu, môžeme vytvoriť niečo, čo žije mimo živote nášho programu, alebo môžeme dokonca niečo zmeniť, ktorá bola vytvorená pred náš program rozbehol. Interakcie so súbormi je naozaj silný časť programovania v jazyku C. a ja som nadšený, aby videli, čo budete vytvárať s ním v kóde, ktorý príde. Moje meno je Jason Hirschhorn. To je CS50. [CS50.TV] [Smiech] Dobre. Jedna sa. Ideme na to. Keď si myslíme, že súboru - >> Oh, počkať. Prepáčte. [Smiech] Tak. Hey there. Keď si myslíme, že súboru - Ak si myslíte, že o súbore - Dobre. Povedz mi, až budeš pripravená. Oh, skvelé. Hoci čítanie z teleprompter môže zdať - no. Moja chyba.