[Powered by Google Translate] [File I / O] [Jason Hirschhorn, Harvard University] [See on CS50, CS50.TV] Kui me mõtleme fail, mida pähe tuleb on Microsoft Wordi dokument, JPEG või MP3 song, ja me suhelda iga tüüpi faile erinevalt. Näiteks Wordi dokumendi lisame teksti samas on JPEG me võiksime kärpida läbi servadest või viimistlema värve. Veel kapoti alla kõik failid meie arvuti on midagi enamat kui pikk jada nulle ja ühtesid. See on kuni konkreetse rakenduse, mis suhtleb fail otsustada, kuidas töödelda selle pika jada ning esitab selle kasutaja. Ühelt poolt võib dokumendi vaadata vaid üks bait, või 8 nulle ja ühtesid ja kuvada ASCII ekraanil. Teiselt poolt, digitaalkujutisena võib vaadata 3 baiti, või 24 nulle ja ühtesid, ja neid tõlgendada kui 3 kuuteistkümnendnumbriga mis esindavad vastavalt punase, rohelise ja sinise ühe piksli pilt. Mis iganes nad võib tunduda ekraanil, tuum, failid on midagi enamat kui jada nulle ja ühtesid. Nii et olgem sukelduda ja vaadata, kuidas me tegelikult manipuleerida neid nulle ja ühtesid kui tegemist kirjalikult ja lugemine failist. Ma alustan murdes see jaguneb lihtne 3-osa protsessist. Järgmine, ma sukelduda kahte koodi näiteid, mis näitavad nimetatud kolme ossa. Lõpuks ma läbi protsessi ja mõned tema kõige olulisemad detailid. Nagu iga fail, mis istub oma töölaual Esimene asi, mida teha on avada. C teeme seda deklareerides kursor eelnevalt struct mis tähistab faili kettal. Selles funktsioon kõne, me ka otsustada, kas me tahame kirjutada või lugeda failist. Järgmine, mida me teeme tegelik lugemise ja kirjutamisega. On mitmeid spetsialiseerunud funktsioone saame kasutada seda osa, ja peaaegu kõik neist algavad tähega F, mis tähistab faili. Lõpuks sarnaneb väike punane X ülemises nurgas failide avamiseks arvutis, me sulgeda fail, mille lõplik funktsioon kõne. Nüüd, kui meil on üldine ettekujutus sellest, mida me teeme, olgem sukelduda kood. Selles kataloogis on meil kaks C faile ja neile vastavad täitmisfaili faile. Kirjutusmasina programm kestab ühe käsurea argument, dokumendi nimetus soovime luua. Sel juhul me kutsume seda doc.txt. Olgem käivitage programm ja sisesta paar rida. Tere. Minu nimi on Jason. Lõpuks me kirjuta "quit." Kui me nüüd loetleda kõik failid sellesse kataloogi, näeme, et uus dokument olemas nn doc.txt. See fail see programm just loodud. Ja muidugi, see liiga on midagi enamat kui pikk jada nulle ja ühtesid. Kui me avame selle uue faili näeme 3 rida koodi me sisenesime meie programm - Tere. Mai nimi on Jason. Aga mis tegelikult toimub, kui typewriter.c jookseb? Esimene rida huvi meie jaoks on line 24. Seda joont, me deklareerime oma faili viitaja. Funktsioon, mis tagastab see pointer, fopen, võtab kaks argumenti. Esimene on faili nimi koos faililaiendiga, kui see on asjakohane. Tuletame meelde, et faililaiend ei mõjuta faili madalaimal tasemel. Oleme alati tegelevad pikk jada nulle ja ühtesid. Aga see ei mõju kuidas failid on tõlgendatud ja milliseid kasutatakse neid avada. Teine argument fopen on ühe tähe mis seisab selle eest, mida me kavatseme teha pärast avame faili. On kolm võimalust selle argumendi - W, R ja A. Valisime w käesoleval juhul, sest tahame kirjutada faili. R, kui saad ilmselt arvan, on lugemiseks failile. Ja on lisades toimikusse. Kuigi nii w ja võib kasutada kirjalikult faili, w hakkab kirjaliku faili algusest ja potentsiaalselt kirjutada mingeid andmeid, mis on eelnevalt salvestatud. Vaikimisi faili avame, kui ta seda juba ei ole, on loodud meie praegune töökataloogi. Kuid kui me tahame pääseda või luua faili teise asukohta, aastal esimene argument fopen, me võib määrata faili tee peale faili nime. Kuigi esimene osa selles protsessis on vaid üks rida koodi pikk, see on alati hea tava lisada veel mõni rida et kontrollida, et tagada fail edukalt avanud või loonud. Kui fopen tagastab null, me ei tahaks liikuda edasi meie programmi, ja see võib juhtuda siis, kui operatsioonisüsteem on mälu otsas või kui me püüame avada faili kataloog, millele meil ei olnud õige õigused. Teine osa protsessist toimub kirjutusmasin on samas silmus. Me kasutame CS50 raamatukogu funktsiooni, et saada sisend kasutaja, ja eeldades, et nad ei taha loobuda programm, me kasutame funktsiooni fputs võtta nöör ja kirjutada see fail. fputs on ainult üks paljudest funktsioone saaksime kasutada, et kirjutada fail. Teised on ümbernimetamisel nimega, fputc, ja isegi fprintf. Sõltumata konkreetse funktsiooni me lõpuks kasutavad, kuigi kõik nad peavad teadma, saab neid argumente, vähemalt kahte asja - mida on vaja kirjutada ja kui see tuleb kirjutada. Meie puhul sisend on string, mis tuleb kirjutada ja fp on viit, mis suunab meid sinna, kus me kirjalikult. Selles programmis, teise osa protsess on üsna lihtne. Me lihtsalt ära string kasutaja ja lisada see otse meie fail vähe-to-no input validation või turvakontrolle. Sageli aga teise osa astub suurema osa oma kood. Lõpuks osa kolm on real 58, kus me sulgeda fail. Siin me kutsume kirjutamisel ja edastada see meie algse faili pointer. Sellele järgnenud rida, me läheme tagasi nulli, signalisatsiooni lõpuks meie programm. Ja, jah, osa kolm on nii lihtne. Liigume edasi lugemine faile. Tagasi meie kataloogi meil fail nimega printer.c. Lähme sõitma seda faili me lihtsalt loodud - doc.txt. See programm, nagu nimigi ütleb, on lihtsalt välja printida faili sisu edastatakse see. Ja seal on meil see. Rida koodi olime trükitud varem ja salvestatud doc.txt. Tere. Minu nimi on Jason. Kui me sukelduda printer.c, näeme, et palju koodi näeb välja sarnane sellega, mida me lihtsalt kõndis läbi typewriter.c. Tõepoolest rida 22, kus avasime faili ja rida 39, kus me suletud faili on mõlemad peaaegu identne typewriter.c, välja arvatud fopen teine ​​argument. Seekord loed failist nii oleme otsustanud r asemel w. Seega, olgem keskenduda teine ​​osa protsessist. Kooskõlas 35, kui teine ​​tingimus meie 4 silmuse, me helistada fgets, kaaslane funktsiooni fputs varem. Seekord on meil kolm argumenti. Esimene on viit massiivi märki kus string salvestatakse. Teine on maksimaalne tähemärkide arv lugeda. Ja kolmas on kursor fail, kellega me töötame. Märkad, et loop lõpeb, kui fgets tagastab null. On kaks põhjust, et see võis juhtuda. Esiteks võib olla tekkinud viga. Teiseks ja veelgi tõenäolisemalt faili lõppu jõudsid ja siis rohkem tähti lugeda. Kui sa ei tea, kaks funktsiooni ei eksisteeri, mis võimaldavad meil öelda mistõttu on põhjust selle konkreetse nullviit. Ja ei ole üllatav, kuna nad on pistmist failidega töötamist, nii ferror funktsioon ja feof funktsioon algavad tähega f. Lõpuks, enne kui me järeldada, üks kiire märkus umbes faili lõppu funktsioon, mis, nagu just mainitud, on kirjutatud feof. Sageli leiad ise, kasutades samal ajal ja silmad järk lugeda oma teed läbi faile. Seega peate viis end need silmad pärast jõuate lõpuks need failid. Üleskutse feof oma faili viitaja ja kontrollides, et näha, kas see on tõsi teeks just seda. Seega samas silmus tingimusega (! Feof (fp)) võib tunduda täiesti sobiv lahendus. Kuid ütleme, et meil on üks rida jäänud meie tekstifaili. Me võida samas loop ja kõik õnnestub nagu planeeritud. Järgmisel ringil läbi, meie programm vaadata, kui feof FP on tõsi, kuid - ja see on oluline punkt, et mõista siin - see ei ole tõsi veel. Ongi, sest eesmärk feof ei ole kontrollida Kui järgmine üleskutse lugeda funktsioon tabab faili lõppu, vaid pigem kontrollida, kas faili lõppu ei ole veel saavutatud. Juhul Selles näites lugedes viimase rea meie fail läheb täiesti sujuvalt, kuid programm ei tea veel, et oleme tabanud end meie fail. See on alles see üks täiendav lugenud, et see letid faili lõppu. Seega õige tingimus oleks järgmine: fgets ja tema kolm argumenti - toodang, suurus väljund, ja fp - ja kõik see ei võrdu tühjaks. See on meetod, võtsime printer.c, ja sel juhul pärast silmus mahasõidud, võid helistada feof või ferror on teavitada kasutajat, et erilisi põhjendusi väljumise see silmus. Kirjutamine ja lugemine failist on selle kõige lihtsamas, lihtne 3-osa protsessist. Esiteks, me faili avada. Teiseks, me paneme mõned asjad meie fail või võtta mõned asjad välja. Kolmandaks, me sulgeda fail. Esimene ja viimane osa on lihtne. Keskosa on kui keeruline värk asub. Ja kuigi all kapuuts me alati tegelevad pikk jada nulle ja ühtesid, see ei aitaks, kui kodeerimine lisada kiht võtmiseks mis lülitab jada millekski, mis meenutab rohkem mida me oleme harjunud nägema. Näiteks, kui me töötame koos 24-bit bitmap faili, me tõenäoliselt lugemise või kirjutamise kolm baiti korraga. Sellisel juhul oleks mõistlik määratleda ja asjakohaselt nime struct mis on 3 baiti suur. Kuigi failidega töötamist võib tunduda keeruline, kasutades neid võimaldab meil teha midagi tõeliselt tähelepanuväärne. Me saame muuta olukorda maailmas väljaspool meie programmi, saame luua midagi, mis elab sealpool elu meie programm, või saame ka muuta midagi, mis loodi enne meie programmi käivitamisel. Suhtlemine failid on tõeliselt võimas osa programmeerimine C. ja ma olen põnevil, et näha, mida sa lähed, et luua koos seda koodi tulla. Minu nimi on Jason Hirschhorn. See on CS50. [CS50.TV] [Naer] Okei. Üks võtta. Läheb lahti. Kui me mõtleme faili - >> Oh, oota. Vabandust. [Naer] Okei. Hei sina seal. Kui me mõtleme faili - Kui te arvate faili - Okei. Ütle mulle, kui sa oled valmis. Tore küll. Kuigi lugemine teleprompter võib tunduda - ei. Minu halb.