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, Harvard University] 3 00:00:04,000 --> 00:00:07,000 [See on CS50, CS50.TV] 4 00:00:07,000 --> 00:00:11,000 Kui me mõtleme fail, mida pähe tuleb on Microsoft Wordi dokument, 5 00:00:11,000 --> 00:00:14,000 JPEG või MP3 song, 6 00:00:14,000 --> 00:00:17,000 ja me suhelda iga tüüpi faile erinevalt. 7 00:00:17,000 --> 00:00:20,000 Näiteks Wordi dokumendi lisame teksti 8 00:00:20,000 --> 00:00:24,000 samas on JPEG me võiksime kärpida läbi servadest või viimistlema värve. 9 00:00:24,000 --> 00:00:28,000 Veel kapoti alla kõik failid meie arvuti on midagi enamat 10 00:00:28,000 --> 00:00:31,000 kui pikk jada nulle ja ühtesid. 11 00:00:31,000 --> 00:00:33,000 See on kuni konkreetse rakenduse, mis suhtleb fail 12 00:00:33,000 --> 00:00:38,000 otsustada, kuidas töödelda selle pika jada ning esitab selle kasutaja. 13 00:00:38,000 --> 00:00:41,000 Ühelt poolt võib dokumendi vaadata vaid üks bait, 14 00:00:41,000 --> 00:00:45,000 või 8 nulle ja ühtesid ja kuvada ASCII ekraanil. 15 00:00:45,000 --> 00:00:48,000 Teiselt poolt, digitaalkujutisena võib vaadata 3 baiti, 16 00:00:48,000 --> 00:00:50,000 või 24 nulle ja ühtesid, 17 00:00:50,000 --> 00:00:53,000 ja neid tõlgendada kui 3 kuuteistkümnendnumbriga 18 00:00:53,000 --> 00:00:56,000 mis esindavad vastavalt punase, rohelise ja sinise 19 00:00:56,000 --> 00:00:58,000 ühe piksli pilt. 20 00:00:58,000 --> 00:01:01,000 Mis iganes nad võib tunduda ekraanil, tuum, 21 00:01:01,000 --> 00:01:05,000 failid on midagi enamat kui jada nulle ja ühtesid. 22 00:01:05,000 --> 00:01:08,000 Nii et olgem sukelduda ja vaadata, kuidas me tegelikult manipuleerida neid nulle ja ühtesid 23 00:01:08,000 --> 00:01:12,000 kui tegemist kirjalikult ja lugemine failist. 24 00:01:12,000 --> 00:01:15,000 >> Ma alustan murdes see jaguneb lihtne 3-osa protsessist. 25 00:01:15,000 --> 00:01:19,000 Järgmine, ma sukelduda kahte koodi näiteid, mis näitavad nimetatud kolme ossa. 26 00:01:19,000 --> 00:01:23,000 Lõpuks ma läbi protsessi ja mõned tema kõige olulisemad detailid. 27 00:01:23,000 --> 00:01:25,000 Nagu iga fail, mis istub oma töölaual 28 00:01:25,000 --> 00:01:28,000 Esimene asi, mida teha on avada. 29 00:01:28,000 --> 00:01:31,000 C teeme seda deklareerides kursor eelnevalt struct 30 00:01:31,000 --> 00:01:33,000 mis tähistab faili kettal. 31 00:01:33,000 --> 00:01:38,460 Selles funktsioon kõne, me ka otsustada, kas me tahame kirjutada või lugeda failist. 32 00:01:38,460 --> 00:01:41,660 Järgmine, mida me teeme tegelik lugemise ja kirjutamisega. 33 00:01:41,660 --> 00:01:44,800 On mitmeid spetsialiseerunud funktsioone saame kasutada seda osa, 34 00:01:44,800 --> 00:01:48,790 ja peaaegu kõik neist algavad tähega F, mis tähistab faili. 35 00:01:48,790 --> 00:01:53,560 Lõpuks sarnaneb väike punane X ülemises nurgas failide avamiseks arvutis, 36 00:01:53,560 --> 00:01:56,680 me sulgeda fail, mille lõplik funktsioon kõne. 37 00:01:56,680 --> 00:01:59,540 Nüüd, kui meil on üldine ettekujutus sellest, mida me teeme, 38 00:01:59,540 --> 00:02:02,000 olgem sukelduda kood. 39 00:02:02,000 --> 00:02:06,100 >> Selles kataloogis on meil kaks C faile ja neile vastavad täitmisfaili faile. 40 00:02:06,100 --> 00:02:09,710 Kirjutusmasina programm kestab ühe käsurea argument, 41 00:02:09,710 --> 00:02:12,060 dokumendi nimetus soovime luua. 42 00:02:12,060 --> 00:02:16,160 Sel juhul me kutsume seda doc.txt. 43 00:02:16,160 --> 00:02:19,080 Olgem käivitage programm ja sisesta paar rida. 44 00:02:19,080 --> 00:02:23,660 Tere. Minu nimi on Jason. 45 00:02:23,660 --> 00:02:26,710 Lõpuks me kirjuta "quit." 46 00:02:26,710 --> 00:02:29,720 Kui me nüüd loetleda kõik failid sellesse kataloogi, 47 00:02:29,720 --> 00:02:33,770 näeme, et uus dokument olemas nn doc.txt. 48 00:02:34,190 --> 00:02:36,110 See fail see programm just loodud. 49 00:02:36,110 --> 00:02:40,520 Ja muidugi, see liiga on midagi enamat kui pikk jada nulle ja ühtesid. 50 00:02:41,100 --> 00:02:43,260 Kui me avame selle uue faili 51 00:02:43,260 --> 00:02:45,870 näeme 3 rida koodi me sisenesime meie programm - 52 00:02:46,060 --> 00:02:49,060 Tere. Mai nimi on Jason. 53 00:02:49,580 --> 00:02:52,090 Aga mis tegelikult toimub, kui typewriter.c jookseb? 54 00:02:52,810 --> 00:02:55,520 Esimene rida huvi meie jaoks on line 24. 55 00:02:55,560 --> 00:02:58,490 Seda joont, me deklareerime oma faili viitaja. 56 00:02:59,080 --> 00:03:03,140 Funktsioon, mis tagastab see pointer, fopen, võtab kaks argumenti. 57 00:03:03,140 --> 00:03:07,440 Esimene on faili nimi koos faililaiendiga, kui see on asjakohane. 58 00:03:07,440 --> 00:03:10,980 Tuletame meelde, et faililaiend ei mõjuta faili madalaimal tasemel. 59 00:03:10,980 --> 00:03:14,640 Oleme alati tegelevad pikk jada nulle ja ühtesid. 60 00:03:14,640 --> 00:03:19,630 Aga see ei mõju kuidas failid on tõlgendatud ja milliseid kasutatakse neid avada. 61 00:03:19,630 --> 00:03:22,290 Teine argument fopen on ühe tähe 62 00:03:22,290 --> 00:03:25,300 mis seisab selle eest, mida me kavatseme teha pärast avame faili. 63 00:03:25,300 --> 00:03:30,630 On kolm võimalust selle argumendi - W, R ja A. 64 00:03:30,630 --> 00:03:34,900 Valisime w käesoleval juhul, sest tahame kirjutada faili. 65 00:03:34,900 --> 00:03:38,820 R, kui saad ilmselt arvan, on lugemiseks failile. 66 00:03:38,820 --> 00:03:41,760 Ja on lisades toimikusse. 67 00:03:41,760 --> 00:03:44,960 Kuigi nii w ja võib kasutada kirjalikult faili, 68 00:03:44,960 --> 00:03:47,460 w hakkab kirjaliku faili algusest 69 00:03:47,460 --> 00:03:50,810 ja potentsiaalselt kirjutada mingeid andmeid, mis on eelnevalt salvestatud. 70 00:03:50,810 --> 00:03:54,070 Vaikimisi faili avame, kui ta seda juba ei ole, 71 00:03:54,070 --> 00:03:57,180 on loodud meie praegune töökataloogi. 72 00:03:57,180 --> 00:04:00,540 Kuid kui me tahame pääseda või luua faili teise asukohta, 73 00:04:00,540 --> 00:04:02,650 aastal esimene argument fopen, 74 00:04:02,650 --> 00:04:05,840 me võib määrata faili tee peale faili nime. 75 00:04:05,840 --> 00:04:09,490 Kuigi esimene osa selles protsessis on vaid üks rida koodi pikk, 76 00:04:09,490 --> 00:04:12,350 see on alati hea tava lisada veel mõni rida 77 00:04:12,350 --> 00:04:15,930 et kontrollida, et tagada fail edukalt avanud või loonud. 78 00:04:15,930 --> 00:04:20,300 Kui fopen tagastab null, me ei tahaks liikuda edasi meie programmi, 79 00:04:20,300 --> 00:04:23,270 ja see võib juhtuda siis, kui operatsioonisüsteem on mälu otsas 80 00:04:23,270 --> 00:04:27,940 või kui me püüame avada faili kataloog, millele meil ei olnud õige õigused. 81 00:04:27,940 --> 00:04:31,780 >> Teine osa protsessist toimub kirjutusmasin on samas silmus. 82 00:04:31,780 --> 00:04:35,000 Me kasutame CS50 raamatukogu funktsiooni, et saada sisend kasutaja, 83 00:04:35,000 --> 00:04:37,190 ja eeldades, et nad ei taha loobuda programm, 84 00:04:37,190 --> 00:04:41,940 me kasutame funktsiooni fputs võtta nöör ja kirjutada see fail. 85 00:04:41,940 --> 00:04:46,700 fputs on ainult üks paljudest funktsioone saaksime kasutada, et kirjutada fail. 86 00:04:46,700 --> 00:04:51,920 Teised on ümbernimetamisel nimega, fputc, ja isegi fprintf. 87 00:04:51,920 --> 00:04:54,840 Sõltumata konkreetse funktsiooni me lõpuks kasutavad, kuigi 88 00:04:54,840 --> 00:04:57,480 kõik nad peavad teadma, saab neid argumente, 89 00:04:57,480 --> 00:04:59,670 vähemalt kahte asja - 90 00:04:59,670 --> 00:05:03,140 mida on vaja kirjutada ja kui see tuleb kirjutada. 91 00:05:03,140 --> 00:05:07,240 Meie puhul sisend on string, mis tuleb kirjutada 92 00:05:07,240 --> 00:05:11,290 ja fp on viit, mis suunab meid sinna, kus me kirjalikult. 93 00:05:11,290 --> 00:05:15,330 Selles programmis, teise osa protsess on üsna lihtne. 94 00:05:15,330 --> 00:05:17,360 Me lihtsalt ära string kasutaja 95 00:05:17,360 --> 00:05:22,120 ja lisada see otse meie fail vähe-to-no input validation või turvakontrolle. 96 00:05:22,120 --> 00:05:26,160 Sageli aga teise osa astub suurema osa oma kood. 97 00:05:26,160 --> 00:05:30,580 Lõpuks osa kolm on real 58, kus me sulgeda fail. 98 00:05:30,580 --> 00:05:34,860 Siin me kutsume kirjutamisel ja edastada see meie algse faili pointer. 99 00:05:34,860 --> 00:05:39,500 Sellele järgnenud rida, me läheme tagasi nulli, signalisatsiooni lõpuks meie programm. 100 00:05:39,500 --> 00:05:42,630 Ja, jah, osa kolm on nii lihtne. 101 00:05:42,630 --> 00:05:45,260 >> Liigume edasi lugemine faile. 102 00:05:45,260 --> 00:05:48,220 Tagasi meie kataloogi meil fail nimega printer.c. 103 00:05:48,220 --> 00:05:50,910 Lähme sõitma seda faili me lihtsalt loodud - 104 00:05:50,910 --> 00:05:53,350 doc.txt. 105 00:05:53,350 --> 00:05:58,150 See programm, nagu nimigi ütleb, on lihtsalt välja printida faili sisu edastatakse see. 106 00:05:58,150 --> 00:06:00,230 Ja seal on meil see. 107 00:06:00,230 --> 00:06:03,780 Rida koodi olime trükitud varem ja salvestatud doc.txt. 108 00:06:03,780 --> 00:06:06,980 Tere. Minu nimi on Jason. 109 00:06:06,980 --> 00:06:09,120 Kui me sukelduda printer.c, 110 00:06:09,120 --> 00:06:13,570 näeme, et palju koodi näeb välja sarnane sellega, mida me lihtsalt kõndis läbi typewriter.c. 111 00:06:13,570 --> 00:06:16,720 Tõepoolest rida 22, kus avasime faili 112 00:06:16,720 --> 00:06:19,220 ja rida 39, kus me suletud faili 113 00:06:19,220 --> 00:06:23,890 on mõlemad peaaegu identne typewriter.c, välja arvatud fopen teine ​​argument. 114 00:06:23,890 --> 00:06:26,510 Seekord loed failist 115 00:06:26,510 --> 00:06:29,040 nii oleme otsustanud r asemel w. 116 00:06:29,040 --> 00:06:31,950 Seega, olgem keskenduda teine ​​osa protsessist. 117 00:06:31,950 --> 00:06:36,060 Kooskõlas 35, kui teine ​​tingimus meie 4 silmuse, 118 00:06:36,060 --> 00:06:38,590 me helistada fgets, 119 00:06:38,590 --> 00:06:42,190 kaaslane funktsiooni fputs varem. 120 00:06:42,190 --> 00:06:44,660 Seekord on meil kolm argumenti. 121 00:06:44,660 --> 00:06:48,810 Esimene on viit massiivi märki kus string salvestatakse. 122 00:06:48,810 --> 00:06:52,670 Teine on maksimaalne tähemärkide arv lugeda. 123 00:06:52,670 --> 00:06:56,010 Ja kolmas on kursor fail, kellega me töötame. 124 00:06:56,010 --> 00:07:00,780 Märkad, et loop lõpeb, kui fgets tagastab null. 125 00:07:00,780 --> 00:07:02,940 On kaks põhjust, et see võis juhtuda. 126 00:07:02,940 --> 00:07:05,380 Esiteks võib olla tekkinud viga. 127 00:07:05,380 --> 00:07:10,740 Teiseks ja veelgi tõenäolisemalt faili lõppu jõudsid ja siis rohkem tähti lugeda. 128 00:07:10,740 --> 00:07:14,040 Kui sa ei tea, kaks funktsiooni ei eksisteeri, mis võimaldavad meil öelda 129 00:07:14,040 --> 00:07:17,160 mistõttu on põhjust selle konkreetse nullviit. 130 00:07:17,160 --> 00:07:21,090 Ja ei ole üllatav, kuna nad on pistmist failidega töötamist, 131 00:07:21,090 --> 00:07:26,940 nii ferror funktsioon ja feof funktsioon algavad tähega f. 132 00:07:26,940 --> 00:07:32,130 >> Lõpuks, enne kui me järeldada, üks kiire märkus umbes faili lõppu funktsioon, 133 00:07:32,130 --> 00:07:36,690 mis, nagu just mainitud, on kirjutatud feof. 134 00:07:36,690 --> 00:07:41,550 Sageli leiad ise, kasutades samal ajal ja silmad järk lugeda oma teed läbi faile. 135 00:07:41,550 --> 00:07:45,790 Seega peate viis end need silmad pärast jõuate lõpuks need failid. 136 00:07:45,790 --> 00:07:50,510 Üleskutse feof oma faili viitaja ja kontrollides, et näha, kas see on tõsi 137 00:07:50,510 --> 00:07:52,310 teeks just seda. 138 00:07:52,310 --> 00:07:59,820 Seega samas silmus tingimusega (! Feof (fp)) võib tunduda täiesti sobiv lahendus. 139 00:07:59,820 --> 00:08:03,770 Kuid ütleme, et meil on üks rida jäänud meie tekstifaili. 140 00:08:03,770 --> 00:08:07,130 Me võida samas loop ja kõik õnnestub nagu planeeritud. 141 00:08:07,130 --> 00:08:12,750 Järgmisel ringil läbi, meie programm vaadata, kui feof FP on tõsi, 142 00:08:12,750 --> 00:08:15,430 kuid - ja see on oluline punkt, et mõista siin - 143 00:08:15,430 --> 00:08:17,770 see ei ole tõsi veel. 144 00:08:17,770 --> 00:08:21,110 Ongi, sest eesmärk feof ei ole kontrollida 145 00:08:21,110 --> 00:08:24,400 Kui järgmine üleskutse lugeda funktsioon tabab faili lõppu, 146 00:08:24,400 --> 00:08:28,190 vaid pigem kontrollida, kas faili lõppu ei ole veel saavutatud. 147 00:08:28,190 --> 00:08:30,140 Juhul Selles näites 148 00:08:30,140 --> 00:08:32,780 lugedes viimase rea meie fail läheb täiesti sujuvalt, 149 00:08:32,780 --> 00:08:36,210 kuid programm ei tea veel, et oleme tabanud end meie fail. 150 00:08:36,210 --> 00:08:40,549 See on alles see üks täiendav lugenud, et see letid faili lõppu. 151 00:08:40,549 --> 00:08:43,210 Seega õige tingimus oleks järgmine: 152 00:08:43,210 --> 00:08:49,330 fgets ja tema kolm argumenti - toodang, suurus väljund, ja fp - 153 00:08:49,330 --> 00:08:52,570 ja kõik see ei võrdu tühjaks. 154 00:08:52,570 --> 00:08:55,260 See on meetod, võtsime printer.c, 155 00:08:55,260 --> 00:08:57,890 ja sel juhul pärast silmus mahasõidud, 156 00:08:57,890 --> 00:09:04,290 võid helistada feof või ferror on teavitada kasutajat, et erilisi põhjendusi väljumise see silmus. 157 00:09:04,290 --> 00:09:08,100 >> Kirjutamine ja lugemine failist on selle kõige lihtsamas, 158 00:09:08,100 --> 00:09:10,150 lihtne 3-osa protsessist. 159 00:09:10,150 --> 00:09:12,530 Esiteks, me faili avada. 160 00:09:12,530 --> 00:09:16,740 Teiseks, me paneme mõned asjad meie fail või võtta mõned asjad välja. 161 00:09:16,740 --> 00:09:19,200 Kolmandaks, me sulgeda fail. 162 00:09:19,200 --> 00:09:21,170 Esimene ja viimane osa on lihtne. 163 00:09:21,170 --> 00:09:23,920 Keskosa on kui keeruline värk asub. 164 00:09:23,920 --> 00:09:27,760 Ja kuigi all kapuuts me alati tegelevad pikk jada nulle ja ühtesid, 165 00:09:27,760 --> 00:09:30,710 see ei aitaks, kui kodeerimine lisada kiht võtmiseks 166 00:09:30,710 --> 00:09:35,350 mis lülitab jada millekski, mis meenutab rohkem mida me oleme harjunud nägema. 167 00:09:35,350 --> 00:09:39,570 Näiteks, kui me töötame koos 24-bit bitmap faili, 168 00:09:39,570 --> 00:09:43,290 me tõenäoliselt lugemise või kirjutamise kolm baiti korraga. 169 00:09:43,290 --> 00:09:46,450 Sellisel juhul oleks mõistlik määratleda ja asjakohaselt nime 170 00:09:46,450 --> 00:09:48,980 struct mis on 3 baiti suur. 171 00:09:48,980 --> 00:09:51,410 >> Kuigi failidega töötamist võib tunduda keeruline, 172 00:09:51,410 --> 00:09:54,530 kasutades neid võimaldab meil teha midagi tõeliselt tähelepanuväärne. 173 00:09:54,530 --> 00:09:58,880 Me saame muuta olukorda maailmas väljaspool meie programmi, 174 00:09:58,880 --> 00:10:01,730 saame luua midagi, mis elab sealpool elu meie programm, 175 00:10:01,730 --> 00:10:07,190 või saame ka muuta midagi, mis loodi enne meie programmi käivitamisel. 176 00:10:07,190 --> 00:10:11,210 Suhtlemine failid on tõeliselt võimas osa programmeerimine C. 177 00:10:11,210 --> 00:10:15,300 ja ma olen põnevil, et näha, mida sa lähed, et luua koos seda koodi tulla. 178 00:10:15,300 --> 00:10:19,770 Minu nimi on Jason Hirschhorn. See on CS50. 179 00:10:19,770 --> 00:10:21,770 [CS50.TV] 180 00:10:21,770 --> 00:10:25,940 >> [Naer] 181 00:10:25,940 --> 00:10:29,330 Okei. Üks võtta. Läheb lahti. 182 00:10:49,000 --> 00:10:52,140 Kui me mõtleme faili - >> Oh, oota. Vabandust. 183 00:10:52,140 --> 00:10:56,800 [Naer] Okei. 184 00:11:06,620 --> 00:11:09,970 Hei sina seal. 185 00:11:13,670 --> 00:11:16,310 Kui me mõtleme faili - 186 00:11:17,610 --> 00:11:20,710 Kui te arvate faili - Okei. Ütle mulle, kui sa oled valmis. 187 00:11:20,710 --> 00:11:22,520 Tore küll. 188 00:11:22,520 --> 00:11:26,180 Kuigi lugemine teleprompter võib tunduda - ei. Minu halb.