1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Lêer I / O] 2 00:00:02,000 --> 00:00:04,000 [Jason Hirschhorn, Harvard Universiteit] 3 00:00:04,000 --> 00:00:07,000 [Dit is CS50, CS50.TV] 4 00:00:07,000 --> 00:00:11,000 Wanneer ons dink van 'n lêer, wat kom na gedagte is 'n Microsoft Word-dokument, 5 00:00:11,000 --> 00:00:14,000 'n JPEG beeld, of 'n MP3 song, 6 00:00:14,000 --> 00:00:17,000 en ons interaksie met elk van hierdie tipes van lêers op verskillende maniere. 7 00:00:17,000 --> 00:00:20,000 Byvoorbeeld, in 'n Word-dokument voeg ons teks 8 00:00:20,000 --> 00:00:24,000 terwyl hy met 'n JPEG beeld ons kan sny uit die kante of die kleure aanraak. 9 00:00:24,000 --> 00:00:28,000 Maar onder die kap al die lêers in ons rekenaar is niks meer 10 00:00:28,000 --> 00:00:31,000 as 'n lang reeks van nulle en ene. 11 00:00:31,000 --> 00:00:33,000 Dit is aan die spesifieke toepassing wat in wisselwerking met die lêer 12 00:00:33,000 --> 00:00:38,000 om te besluit hoe om hierdie lang reeks te verwerk en aan te bied aan die gebruiker. 13 00:00:38,000 --> 00:00:41,000 Aan die een kant, kan 'n dokument kyk na net een byte, 14 00:00:41,000 --> 00:00:45,000 of 8 nulle en ene, en 'n ASCII-karakter op die skerm vertoon. 15 00:00:45,000 --> 00:00:48,000 Aan die ander kant, kan 'n bitmap image kyk na 3 bytes, 16 00:00:48,000 --> 00:00:50,000 of 24 nulle en ene, 17 00:00:50,000 --> 00:00:53,000 en interpreteer dit as 3 heksadesimale getalle 18 00:00:53,000 --> 00:00:56,000 wat verteenwoordig die waardes vir rooi, groen en blou 19 00:00:56,000 --> 00:00:58,000 in een pixel van 'n beeld. 20 00:00:58,000 --> 00:01:01,000 Wat hulle ook al mag lyk op jou skerm, op hul kern, 21 00:01:01,000 --> 00:01:05,000 lêers is niks meer as 'n reeks van nulle en ene. 22 00:01:05,000 --> 00:01:08,000 So laat ons duik in en kyk na hoe ons eintlik manipuleer hierdie nulle en ene 23 00:01:08,000 --> 00:01:12,000 wanneer dit kom by die skryf en lees van 'n lêer. 24 00:01:12,000 --> 00:01:15,000 >> Ek sal begin deur te breek dit af in 'n eenvoudige 3-deel. 25 00:01:15,000 --> 00:01:19,000 Volgende, sal ek duik in twee code voorbeelde wat hierdie drie dele te demonstreer. 26 00:01:19,000 --> 00:01:23,000 Ten slotte, ek sal die proses te hersien en sommige van sy mees belangrike besonderhede. 27 00:01:23,000 --> 00:01:25,000 Soos met enige lêer wat sit op jou lessenaar, 28 00:01:25,000 --> 00:01:28,000 die eerste ding om te doen is om dit oop te maak. 29 00:01:28,000 --> 00:01:31,000 In C doen ons dit deur te verklaar 'n wyser na 'n vooraf gedefinieerde struct 30 00:01:31,000 --> 00:01:33,000 wat 'n lêer op die hardeskyf. 31 00:01:33,000 --> 00:01:38,460 In hierdie funksie oproep, het ons ook besluit of ons wil skryf of lees van die lêer. 32 00:01:38,460 --> 00:01:41,660 Volgende, ons doen die werklike lees en skryf. 33 00:01:41,660 --> 00:01:44,800 Daar is 'n aantal van gespesialiseerde funksies wat ons kan gebruik in hierdie deel, 34 00:01:44,800 --> 00:01:48,790 en byna almal van hulle begin met die letter F, wat staan ​​vir die lêer. 35 00:01:48,790 --> 00:01:53,560 Laaste, wat verwant is aan die klein rooi X in die boonste hoek van die lêers op jou rekenaar oopmaak, 36 00:01:53,560 --> 00:01:56,680 ons maak die lêer met 'n finale funksie oproep. 37 00:01:56,680 --> 00:01:59,540 Nou dat ons 'n algemene idee van wat ons gaan doen, 38 00:01:59,540 --> 00:02:02,000 laat ons duik in die kode. 39 00:02:02,000 --> 00:02:06,100 >> In hierdie gids, het ons twee C-lêers en hul ooreenstemmende uitvoerbare lêers. 40 00:02:06,100 --> 00:02:09,710 Die tikmasjien program neem 'n command line argument, 41 00:02:09,710 --> 00:02:12,060 die naam van die dokument wat ons wil skep. 42 00:02:12,060 --> 00:02:16,160 In hierdie geval is, sal ons 'n beroep dit doc.txt. 43 00:02:16,160 --> 00:02:19,080 Kom ons voer die program uit en voer 'n paar lyne. 44 00:02:19,080 --> 00:02:23,660 Hi. My naam is Jason. 45 00:02:23,660 --> 00:02:26,710 Ten slotte, sal ons tik "ophou." 46 00:02:26,710 --> 00:02:29,720 As ons nou n lys van al die lêers in hierdie gids, 47 00:02:29,720 --> 00:02:33,770 sien ons dat 'n nuwe dokument bestaan ​​genoem doc.txt. 48 00:02:34,190 --> 00:02:36,110 Dit is die lêer hierdie program nou net gemaak het. 49 00:02:36,110 --> 00:02:40,520 En natuurlik, dit is ook niks meer as 'n lang reeks van nulle en ene. 50 00:02:41,100 --> 00:02:43,260 As ons hierdie nuwe lêer oopmaak, 51 00:02:43,260 --> 00:02:45,870 sien ons die 3 reëls van die kode wat ons het in ons program - 52 00:02:46,060 --> 00:02:49,060 Hi. Mei naam is Jason. 53 00:02:49,580 --> 00:02:52,090 Maar wat eintlik gaan wanneer typewriter.c loop? 54 00:02:52,810 --> 00:02:55,520 Die eerste reël van belang vir ons is in lyn 24. 55 00:02:55,560 --> 00:02:58,490 In hierdie lyn, ons verklaar ons lêer wyser. 56 00:02:59,080 --> 00:03:03,140 Die funksie wat gee hierdie pointer, fopen, neem twee argumente. 57 00:03:03,140 --> 00:03:07,440 Die eerste is die lêernaam insluitend die lêeruitbreiding indien toepaslik. 58 00:03:07,440 --> 00:03:10,980 Onthou dat 'n lêer uitbreiding nie die lêer op sy laagste vlak beïnvloed. 59 00:03:10,980 --> 00:03:14,640 Ons is altyd op die hantering van 'n lang reeks van nulle en ene. 60 00:03:14,640 --> 00:03:19,630 Maar dit is nie invloed hoe lêers geïnterpreteer word en wat aansoeke word gebruik om hulle oop te maak. 61 00:03:19,630 --> 00:03:22,290 Die tweede argument te fopen is 'n enkele brief 62 00:03:22,290 --> 00:03:25,300 wat staan ​​vir wat ons beplan om te doen nadat ons die lêer oopmaak. 63 00:03:25,300 --> 00:03:30,630 Daar is drie opsies vir hierdie argument - W, R, en A. 64 00:03:30,630 --> 00:03:34,900 Ons het gekies om w in hierdie geval, want ons wil om te skryf na die lêer. 65 00:03:34,900 --> 00:03:38,820 R, soos jy kan dink, is vir die lees van die lêer. 66 00:03:38,820 --> 00:03:41,760 En 'n is vir die aanbring na die lêer. 67 00:03:41,760 --> 00:03:44,960 Terwyl beide w en 'n kan gebruik word vir die skryf van tot lêers, 68 00:03:44,960 --> 00:03:47,460 w vanaf die begin van die lêer sal begin skryf 69 00:03:47,460 --> 00:03:50,810 en potensieel oorskryf enige data wat voorheen gestoor. 70 00:03:50,810 --> 00:03:54,070 By verstek, die lêer oopmaak, indien dit nie reeds bestaan ​​nie, 71 00:03:54,070 --> 00:03:57,180 geskep word in ons huidige werk gids. 72 00:03:57,180 --> 00:04:00,540 Maar as ons wil om toegang te kry of skep 'n lêer in 'n ander plek, 73 00:04:00,540 --> 00:04:02,650 in die eerste argument van fopen, 74 00:04:02,650 --> 00:04:05,840 kan ons 'n pad van die lêer in bykomend tot die lêernaam spesifiseer. 75 00:04:05,840 --> 00:04:09,490 Terwyl die eerste deel van hierdie proses is slegs een lyn van kode lank, 76 00:04:09,490 --> 00:04:12,350 dit is altyd goeie praktyk om 'n ander stel reëls in te sluit 77 00:04:12,350 --> 00:04:15,930 wat gaan om te verseker dat die lêer is suksesvol oopgemaak of geskep. 78 00:04:15,930 --> 00:04:20,300 As fopen terugkeer null, sou ons nie wil voortgaan met ons program, 79 00:04:20,300 --> 00:04:23,270 en dit kan gebeur as die bedryfstelsel is uit die geheue 80 00:04:23,270 --> 00:04:27,940 of as ons probeer om 'n lêer oop te maak in 'n gids waarvoor ons nie die behoorlike regte het. 81 00:04:27,940 --> 00:04:31,780 >> Deel twee van die proses plaasvind in die tikmasjien se while lus. 82 00:04:31,780 --> 00:04:35,000 Ons maak gebruik van 'n CS50 biblioteek funksie om insette te kry van die gebruiker, 83 00:04:35,000 --> 00:04:37,190 en deur aan te neem dat hulle nie wil hê om die program af te sluit, 84 00:04:37,190 --> 00:04:41,940 ons gebruik die funksie fputs die tou te neem en skryf dit na die lêer. 85 00:04:41,940 --> 00:04:46,700 fputs is slegs een van die vele funksies wat ons kan gebruik om te skryf na die lêer. 86 00:04:46,700 --> 00:04:51,920 Ander sluit fwrite, fputc, en selfs fprintf. 87 00:04:51,920 --> 00:04:54,840 Ongeag van die betrokke funksie het ons uiteindelik gebruik, al is, 88 00:04:54,840 --> 00:04:57,480 almal van hulle nodig het om te weet, deur middel van hul argumente, 89 00:04:57,480 --> 00:04:59,670 ten minste twee dinge - 90 00:04:59,670 --> 00:05:03,140 wat gedoen moet word geskryf en waar dit geskryf moet word. 91 00:05:03,140 --> 00:05:07,240 In ons geval, die insette is die string wat geskryf moet word 92 00:05:07,240 --> 00:05:11,290 en fp is die wyser wat lei ons na die plek waar ons skryf. 93 00:05:11,290 --> 00:05:15,330 In hierdie program, deel twee van die proses is redelik eenvoudig. 94 00:05:15,330 --> 00:05:17,360 Ons is eenvoudig die neem van 'n string van die gebruiker 95 00:05:17,360 --> 00:05:22,120 en voeg dit direk aan ons lêer met min-tot-geen insette validering of sekuriteit kontrole. 96 00:05:22,120 --> 00:05:26,160 Dikwels, egter, sal deel twee neem die grootste deel van jou kode. 97 00:05:26,160 --> 00:05:30,580 Ten slotte, deel drie is on line 58, waar ons die lêer te sluit. 98 00:05:30,580 --> 00:05:34,860 Hier noem ons fclose en dit slaag ons oorspronklike lêer wyser. 99 00:05:34,860 --> 00:05:39,500 In die daaropvolgende reël, keer ons terug nul, 'n teken van die einde van ons program. 100 00:05:39,500 --> 00:05:42,630 En ja, deel drie is so eenvoudig soos dit. 101 00:05:42,630 --> 00:05:45,260 >> Kom ons beweeg op die lees van lêers. 102 00:05:45,260 --> 00:05:48,220 Terug in ons gids het n lêer genaamd printer.c. 103 00:05:48,220 --> 00:05:50,910 Kom ons loop dit met die lêer wat ons nou net gemaak het - 104 00:05:50,910 --> 00:05:53,350 doc.txt. 105 00:05:53,350 --> 00:05:58,150 Hierdie program, soos die naam aandui, sal eenvoudig druk die inhoud van die lêer geslaag het om dit te. 106 00:05:58,150 --> 00:06:00,230 En daar het ons dit. 107 00:06:00,230 --> 00:06:03,780 Die reëls van die kode wat ons vroeër getik en gestoor in doc.txt. 108 00:06:03,780 --> 00:06:06,980 Hi. My naam is Jason. 109 00:06:06,980 --> 00:06:09,120 As ons duik in printer.c 110 00:06:09,120 --> 00:06:13,570 sien ons dat 'n baie van die kode lyk soortgelyk aan wat ons net deurwandel het in typewriter.c. 111 00:06:13,570 --> 00:06:16,720 Inderdaad line 22, waar ons die lêer oopgemaak, 112 00:06:16,720 --> 00:06:19,220 en lyn 39, waar ons die lêer gesluit, 113 00:06:19,220 --> 00:06:23,890 is albei byna identies aan typewriter.c, behalwe vir fopen tweede argument. 114 00:06:23,890 --> 00:06:26,510 Hierdie keer het ons van 'n lêer te lees, 115 00:06:26,510 --> 00:06:29,040 sodat ons gekies het om r in plaas van w. 116 00:06:29,040 --> 00:06:31,950 So, laat se fokus op die tweede deel van die proses. 117 00:06:31,950 --> 00:06:36,060 In lyn 35, as die tweede toestand in ons 4 lus, 118 00:06:36,060 --> 00:06:38,590 maak ons ​​'n oproep tot fgets, 119 00:06:38,590 --> 00:06:42,190 die metgesel funksie te fputs voor. 120 00:06:42,190 --> 00:06:44,660 Hierdie keer het ons drie argumente. 121 00:06:44,660 --> 00:06:48,810 Die eerste is die wyser na die verskeidenheid van karakters waar string gestoor word. 122 00:06:48,810 --> 00:06:52,670 Die tweede is die maksimum aantal van karakters om gelees te word. 123 00:06:52,670 --> 00:06:56,010 En die derde is die wyser na die lêer waarmee ons werk. 124 00:06:56,010 --> 00:07:00,780 Jy sal sien dat die loop eindig wanneer fgets terugkeer null. 125 00:07:00,780 --> 00:07:02,940 Daar is twee rede dat dit gebeur het. 126 00:07:02,940 --> 00:07:05,380 Eerstens, kan 'n fout plaasgevind het. 127 00:07:05,380 --> 00:07:10,740 Tweede, en meer waarskynlik, is die einde van die lêer bereik en nie meer karakters is gelees. 128 00:07:10,740 --> 00:07:14,040 In geval jy wonder, bestaan ​​twee funksies wat ons toelaat om te vertel 129 00:07:14,040 --> 00:07:17,160 watter rede is die oorsaak vir hierdie spesifieke null pointer. 130 00:07:17,160 --> 00:07:21,090 En, nie verrassend nie, omdat hulle te doen het met die werk met lêers, 131 00:07:21,090 --> 00:07:26,940 beide die ferror funksie en die feof funksie begin met die letter f. 132 00:07:26,940 --> 00:07:32,130 >> Ten slotte, voordat ons tot die gevolgtrekking, 'n vinnige nota oor die einde van die lêer funksie, 133 00:07:32,130 --> 00:07:36,690 wat, as net genoem het, is geskryf as feof. 134 00:07:36,690 --> 00:07:41,550 Dikwels sal jy vind jouself ruk en vir loops gebruik om progressief te lees jou pad deur lêers. 135 00:07:41,550 --> 00:07:45,790 So, sal jy 'n manier om hierdie loops te beëindig nadat jy aan die einde van hierdie lêers. 136 00:07:45,790 --> 00:07:50,510 Oproep feof op jou lêer wyser en om te kyk of dit waar is 137 00:07:50,510 --> 00:07:52,310 sal doen net dat. 138 00:07:52,310 --> 00:07:59,820 Dus, kan 'n rukkie loop met die voorwaarde (feof (GF)!) Lyk soos 'n perfek geskikte oplossing. 139 00:07:59,820 --> 00:08:03,770 Egter sê dat ons een lyn links in ons teks lêer. 140 00:08:03,770 --> 00:08:07,130 Ons sal ons while lus betree en alles sal uitwerk soos beplan. 141 00:08:07,130 --> 00:08:12,750 Op die volgende ronde deur, sal ons program te kyk om te sien of feof van fp is waar, 142 00:08:12,750 --> 00:08:15,430 maar - en dit is die belangrike punt om hier te verstaan ​​- 143 00:08:15,430 --> 00:08:17,770 dit sal nie waar wees nie net nog nie. 144 00:08:17,770 --> 00:08:21,110 Dit is omdat die doel van feof is nie om te kyk 145 00:08:21,110 --> 00:08:24,400 indien die volgende oproep tot 'n lees funksie sal die einde van die lêer te tref, 146 00:08:24,400 --> 00:08:28,190 maar eerder om te kyk of die einde van die lêer is reeds bereik. 147 00:08:28,190 --> 00:08:30,140 In die geval van hierdie voorbeeld, 148 00:08:30,140 --> 00:08:32,780 die lees van die laaste lyn van ons lêer gaan perfek glad, 149 00:08:32,780 --> 00:08:36,210 maar die program nog nie weet dat ons die einde van ons lêer het getref. 150 00:08:36,210 --> 00:08:40,549 Dit is nie totdat dit een addisionele lees dat dit tellers die einde van die lêer. 151 00:08:40,549 --> 00:08:43,210 Dus, sou 'n korrekte toestand die volgende wees: 152 00:08:43,210 --> 00:08:49,330 fgets en sy drie argumente - uitset, grootte van die uitset, en fp - 153 00:08:49,330 --> 00:08:52,570 en al van daardie nie gelyk aan nul. 154 00:08:52,570 --> 00:08:55,260 Dit is die benadering wat ons het in printer.c, 155 00:08:55,260 --> 00:08:57,890 en in hierdie geval, na die lus uitgange, 156 00:08:57,890 --> 00:09:04,290 jy kan noem feof of ferror die gebruiker in te lig met betrekking tot die spesifieke redenasie vir die verlaat van hierdie lus. 157 00:09:04,290 --> 00:09:08,100 >> Skriftelik aan en lees van 'n lêer is, op sy mees basiese, 158 00:09:08,100 --> 00:09:10,150 'n eenvoudige 3-deel. 159 00:09:10,150 --> 00:09:12,530 Eerstens, het ons die lêer oopmaak. 160 00:09:12,530 --> 00:09:16,740 Tweedens, ons het 'n paar dinge in ons lêer of neem 'n paar dinge uit dit uit. 161 00:09:16,740 --> 00:09:19,200 Derdens, ons maak die lêer. 162 00:09:19,200 --> 00:09:21,170 Die eerste en laaste dele is maklik. 163 00:09:21,170 --> 00:09:23,920 Die middelste gedeelte is waar die moeilike dinge lê. 164 00:09:23,920 --> 00:09:27,760 En al onder die kap ons altyd die hantering van 'n lang reeks van nulle en ene, 165 00:09:27,760 --> 00:09:30,710 dit nie help wanneer die kodering van 'n laag van abstraksie te voeg 166 00:09:30,710 --> 00:09:35,350 wat verander die volgorde in iets wat meer lyk wat ons gebruik om te sien. 167 00:09:35,350 --> 00:09:39,570 Byvoorbeeld, as ons werk met 'n 24-bis bitmap lêer, 168 00:09:39,570 --> 00:09:43,290 ons sal waarskynlik lees of skryf drie grepe op 'n slag. 169 00:09:43,290 --> 00:09:46,450 In welke geval, sou dit sin maak om te definieer en toepaslik noem 170 00:09:46,450 --> 00:09:48,980 'n struct 3 bytes groot is. 171 00:09:48,980 --> 00:09:51,410 >> Hoewel die werk met lêers mag lyk ingewikkeld, 172 00:09:51,410 --> 00:09:54,530 gebruik te maak van hulle kan ons iets werklik merkwaardige te doen. 173 00:09:54,530 --> 00:09:58,880 Ons kan verander die toestand van die wêreld buite ons program, 174 00:09:58,880 --> 00:10:01,730 ons kan skep iets wat buite die lewe van ons program woon, 175 00:10:01,730 --> 00:10:07,190 of ons kan selfs die verandering van iets wat geskep is voordat ons program begin hardloop. 176 00:10:07,190 --> 00:10:11,210 Interaksie met lêers is 'n werklik kragtige deel van programmering in C. 177 00:10:11,210 --> 00:10:15,300 en ek is opgewonde om te sien wat jy gaan om te skep met dit in die kode om te kom. 178 00:10:15,300 --> 00:10:19,770 My naam is Jason Hirschhorn. Dit is CS50. 179 00:10:19,770 --> 00:10:21,770 [CS50.TV] 180 00:10:21,770 --> 00:10:25,940 >> [Lag] 181 00:10:25,940 --> 00:10:29,330 Okay. Een neem. Hier gaan ons. 182 00:10:49,000 --> 00:10:52,140 Wanneer ons dink van 'n lêer - >> O, wag. Jammer. 183 00:10:52,140 --> 00:10:56,800 [Gelag] Goed. 184 00:11:06,620 --> 00:11:09,970 Hey daar. 185 00:11:13,670 --> 00:11:16,310 Wanneer ons dink van 'n lêer - 186 00:11:17,610 --> 00:11:20,710 Wanneer jy dink van 'n lêer - Okay. Vertel my wanneer jy klaar is. 187 00:11:20,710 --> 00:11:22,520 Ag, geweldig. 188 00:11:22,520 --> 00:11:26,180 Hoewel die lees van 'n teleprompter mag lyk - nie. My slegte.