1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Faili I / O] 2 00:00:02,000 --> 00:00:04,000 [Jason Hirschhorn, Chuo Kikuu cha Harvard] 3 00:00:04,000 --> 00:00:07,000 [Hii ni CS50, CS50.TV] 4 00:00:07,000 --> 00:00:11,000 Tunapofikiria faili, nini inakuja akilini ni Neno Microsoft hati, 5 00:00:11,000 --> 00:00:14,000 JPEG picha, au wimbo MP3, 6 00:00:14,000 --> 00:00:17,000 na sisi kushirikiana na kila ya aina hii ya files katika njia tofauti. 7 00:00:17,000 --> 00:00:20,000 Kwa mfano, katika hati Neno sisi kuongeza Nakala 8 00:00:20,000 --> 00:00:24,000 wakati na picha JPEG tupate mazao nje edges au retouch rangi. 9 00:00:24,000 --> 00:00:28,000 Hata hivyo chini ya Hood aina ya files katika kompyuta yetu ni kitu zaidi 10 00:00:28,000 --> 00:00:31,000 kuliko mlolongo mrefu wa zeros na ndio. 11 00:00:31,000 --> 00:00:33,000 Ni juu ya maombi maalum ambayo inaingiliana na faili 12 00:00:33,000 --> 00:00:38,000 kuamua jinsi mchakato huu mlolongo mrefu na sasa ni kwa mtumiaji. 13 00:00:38,000 --> 00:00:41,000 Kwa upande mmoja, hati inaweza kuangalia saa tu Byte moja, 14 00:00:41,000 --> 00:00:45,000 au 8 zeros na ndio, na kuonyesha tabia ASCII kwenye screen. 15 00:00:45,000 --> 00:00:48,000 Kwa upande mwingine, picha bitmap wanaweza kuangalia ka 3, 16 00:00:48,000 --> 00:00:50,000 au 24 zeros na ndio, 17 00:00:50,000 --> 00:00:53,000 na kutafsiri yao kama namba 3 hexadesimoli 18 00:00:53,000 --> 00:00:56,000 kwamba kuwakilisha maadili kwa nyekundu, kijani, na bluu 19 00:00:56,000 --> 00:00:58,000 katika moja ya pixel ya picha. 20 00:00:58,000 --> 00:01:01,000 Chochote wanaweza kuangalia kama kwenye kioo, saa yao ya msingi, 21 00:01:01,000 --> 00:01:05,000 files ni kitu zaidi kuliko mlolongo wa zeros na ndio. 22 00:01:05,000 --> 00:01:08,000 Hivyo hebu kupiga mbizi katika na kuangalia jinsi sisi kweli kuendesha zeros haya na ndio 23 00:01:08,000 --> 00:01:12,000 linapokuja kuandika na kusoma kutoka faili. 24 00:01:12,000 --> 00:01:15,000 >> Mimi itabidi kuanza kwa kuvunja chini katika mchakato rahisi 3-sehemu. 25 00:01:15,000 --> 00:01:19,000 Next, mimi itabidi kupiga mbizi katika mifano code mbili kwamba kuonyesha sehemu hizi tatu. 26 00:01:19,000 --> 00:01:23,000 Mwisho, mimi utakagua mchakato na baadhi ya maelezo yake muhimu. 27 00:01:23,000 --> 00:01:25,000 Kama na faili yoyote aketiye juu ya desktop yako, 28 00:01:25,000 --> 00:01:28,000 Kitu cha kwanza kufanya ni kufungua hiyo. 29 00:01:28,000 --> 00:01:31,000 Katika C tunafanya hili kwa kutangaza pointer struct predefined 30 00:01:31,000 --> 00:01:33,000 kwamba inawakilisha faili kwenye disk. 31 00:01:33,000 --> 00:01:38,460 Katika wito kazi hii, sisi pia kuamua kama tunataka kuandika au kusoma kutoka faili. 32 00:01:38,460 --> 00:01:41,660 Next, sisi kufanya kusoma halisi na kuandika. 33 00:01:41,660 --> 00:01:44,800 Kuna idadi ya kazi maalumu tunaweza kutumia katika sehemu hii, 34 00:01:44,800 --> 00:01:48,790 na karibu wote wa kwao kuanza na F barua, ambayo inasimamia kwa faili. 35 00:01:48,790 --> 00:01:53,560 Mwisho, sawa na kidogo X nyekundu katika kona ya juu ya files kufungua kwenye kompyuta yako, 36 00:01:53,560 --> 00:01:56,680 sisi karibu faili na wito wa mwisho kazi. 37 00:01:56,680 --> 00:01:59,540 Sasa kwa kuwa tuna wazo jumla ya nini tunakwenda kufanya, 38 00:01:59,540 --> 00:02:02,000 hebu tuzame katika kanuni. 39 00:02:02,000 --> 00:02:06,100 >> Katika orodha hii, tuna mbili files C na files zao sambamba kutekelezwa. 40 00:02:06,100 --> 00:02:09,710 mpango typewriter inachukua moja ya mstari amri hoja, 41 00:02:09,710 --> 00:02:12,060 jina la hati tunataka kujenga. 42 00:02:12,060 --> 00:02:16,160 Katika kesi hii, tutaweza kuiita doc.txt. 43 00:02:16,160 --> 00:02:19,080 Hebu kuendesha programu na kuingia michache ya mistari. 44 00:02:19,080 --> 00:02:23,660 Hi. Jina langu ni Jason. 45 00:02:23,660 --> 00:02:26,710 Hatimaye, tutaweza aina "quit." 46 00:02:26,710 --> 00:02:29,720 Kama sisi sasa orodha yote ya files katika saraka hii, 47 00:02:29,720 --> 00:02:33,770 tunaona kwamba hati mpya iliopo kuitwa doc.txt. 48 00:02:34,190 --> 00:02:36,110 Hiyo faili mpango huu tu kuundwa. 49 00:02:36,110 --> 00:02:40,520 Na bila shaka, hiyo pia ni kitu zaidi kuliko mlolongo mrefu wa zeros na ndio. 50 00:02:41,100 --> 00:02:43,260 Kama sisi kufungua faili hii mpya, 51 00:02:43,260 --> 00:02:45,870 tunaona mistari 3 ya maadili ya sisi aliingia katika mpango wetu - 52 00:02:46,060 --> 00:02:49,060 Hi. Mei jina ni Jason. 53 00:02:49,580 --> 00:02:52,090 Lakini nini hasa kinachoendelea wakati typewriter.c anaendesha? 54 00:02:52,810 --> 00:02:55,520 mstari wa kwanza wa maslahi kwa ajili yetu ni mstari 24. 55 00:02:55,560 --> 00:02:58,490 Katika mstari huu, sisi kutangaza faili wetu pointer. 56 00:02:59,080 --> 00:03:03,140 kazi kwamba anarudi hii pointer, fopen, inachukua hoja mbili. 57 00:03:03,140 --> 00:03:07,440 kwanza ni jina la faili ikiwa ni pamoja na ugani faili kama inafaa. 58 00:03:07,440 --> 00:03:10,980 Kumbuka kwamba faili ugani haina ushawishi faili katika ngazi ya chini yake. 59 00:03:10,980 --> 00:03:14,640 Sisi ni daima kushughulika na mlolongo mrefu wa zeros na ndio. 60 00:03:14,640 --> 00:03:19,630 Lakini haina ushawishi jinsi files ni kufasiriwa na maombi yale ni kutumika kufungua yao. 61 00:03:19,630 --> 00:03:22,290 Hoja ya pili fopen ni barua moja 62 00:03:22,290 --> 00:03:25,300 kwamba anasimama kwa nini sisi mpango wa kufanya baada ya sisi kufungua faili. 63 00:03:25,300 --> 00:03:30,630 Kuna chaguzi tatu kwa hoja hii - W, R, na A. 64 00:03:30,630 --> 00:03:34,900 Tumekuwa wateule w katika kesi hii kwa sababu tunataka kuandika kwenye faili. 65 00:03:34,900 --> 00:03:38,820 R, kama pengine unaweza nadhani, ni kwa ajili ya kusoma na faili. 66 00:03:38,820 --> 00:03:41,760 Na ni kwa appending na faili. 67 00:03:41,760 --> 00:03:44,960 Wakati wote w na inaweza kutumika kwa ajili ya kuandika kwa files, 68 00:03:44,960 --> 00:03:47,460 w kuanza kuandika tangu mwanzo wa faili 69 00:03:47,460 --> 00:03:50,810 na uwezekano wa overwrite data yoyote ambayo awali imekuwa kuhifadhiwa. 70 00:03:50,810 --> 00:03:54,070 By default, faili sisi kufungua, ikiwa haina tayari zipo, 71 00:03:54,070 --> 00:03:57,180 ni umba katika saraka yetu ya sasa ya kazi. 72 00:03:57,180 --> 00:04:00,540 Hata hivyo, kama tunataka kupata au kuunda faili katika eneo tofauti, 73 00:04:00,540 --> 00:04:02,650 katika hoja ya kwanza ya fopen, 74 00:04:02,650 --> 00:04:05,840 tunaweza kutaja Njia ya faili pamoja na jina la faili. 75 00:04:05,840 --> 00:04:09,490 Wakati sehemu ya kwanza ya mchakato huu ni moja tu mstari wa kanuni ya muda mrefu, 76 00:04:09,490 --> 00:04:12,350 mara nyingi ni vizuri mazoezi ya pamoja na kuweka mwingine wa mistari 77 00:04:12,350 --> 00:04:15,930 kwamba kuangalia kuhakikisha kwamba faili ya mara kwa mafanikio kufunguliwa au kuundwa. 78 00:04:15,930 --> 00:04:20,300 Kama fopen anarudi null, sisi si unataka kuendelea na mpango wetu, 79 00:04:20,300 --> 00:04:23,270 na hii inaweza kutokea kama mfumo wa uendeshaji ni nje ya kumbukumbu 80 00:04:23,270 --> 00:04:27,940 au kama sisi kujaribu kufungua faili katika saraka ambayo hatukuwa na permissions sahihi. 81 00:04:27,940 --> 00:04:31,780 >> Sehemu ya pili ya mchakato unafanyika katika wakati typewriter kitanzi cha. 82 00:04:31,780 --> 00:04:35,000 Sisi kutumia CS50 maktaba kazi kupata mawazo kutoka kwa mtumiaji, 83 00:04:35,000 --> 00:04:37,190 na kuchukua wao hawataki kuacha mpango, 84 00:04:37,190 --> 00:04:41,940 sisi kutumia fputs kazi kuchukua kamba na kuandika ni kwa faili. 85 00:04:41,940 --> 00:04:46,700 fputs ni moja tu ya kazi nyingi tunaweza kutumia kuandika kwenye faili. 86 00:04:46,700 --> 00:04:51,920 Wengine ni pamoja na fwrite, fputc, na hata fprintf. 87 00:04:51,920 --> 00:04:54,840 Bila kujali kazi fulani sisi kuishia kutumia, ingawa, 88 00:04:54,840 --> 00:04:57,480 wote haja ya kujua, kupitia hoja zao, 89 00:04:57,480 --> 00:04:59,670 angalau mambo mawili - 90 00:04:59,670 --> 00:05:03,140 nini mahitaji ya kuwa imeandikwa na ambapo inahitaji kuwa imeandikwa na. 91 00:05:03,140 --> 00:05:07,240 Katika kesi yetu, pembejeo ni string kwamba mahitaji ya kuwa imeandikwa 92 00:05:07,240 --> 00:05:11,290 na fp ni pointer kwamba kutuelekeza ambapo sisi ni kuandika. 93 00:05:11,290 --> 00:05:15,330 Katika mpango huu, sehemu ya pili ya mchakato ni badala ya moja kwa moja. 94 00:05:15,330 --> 00:05:17,360 Sisi ni tu kuchukua string kutoka kwa mtumiaji 95 00:05:17,360 --> 00:05:22,120 na kuongeza kuwa moja kwa moja na faili wetu na kidogo-kwa-hakuna uthibitisho pembejeo au hundi ya usalama. 96 00:05:22,120 --> 00:05:26,160 Mara nyingi, hata hivyo, sehemu mbili itachukua juu ya wingi wa code yako. 97 00:05:26,160 --> 00:05:30,580 Hatimaye, sehemu tatu ni juu ya mstari 58, ambapo sisi karibu faili. 98 00:05:30,580 --> 00:05:34,860 Hapa sisi kuwaita fclose na kupita faili yetu ya awali pointer. 99 00:05:34,860 --> 00:05:39,500 Katika mstari baadae, sisi kurudi sifuri kumuashiria mwisho wa programu yetu. 100 00:05:39,500 --> 00:05:42,630 Na, ndio, sehemu tatu ni rahisi kama hayo. 101 00:05:42,630 --> 00:05:45,260 >> Hebu hoja juu ya kusoma kutoka files. 102 00:05:45,260 --> 00:05:48,220 Nyuma katika saraka yetu tuna faili inayoitwa printer.c. 103 00:05:48,220 --> 00:05:50,910 Hebu kukimbia kwa faili sisi tu umba - 104 00:05:50,910 --> 00:05:53,350 doc.txt. 105 00:05:53,350 --> 00:05:58,150 Mpango huu, kama jina linavyosema, mapenzi tu magazeti nje ya yaliyomo ya faili kupita humo. 106 00:05:58,150 --> 00:06:00,230 Na kuna sisi kuwa nayo. 107 00:06:00,230 --> 00:06:03,780 mstari wa kanuni tulikuwa typed mapema na kuokolewa katika doc.txt. 108 00:06:03,780 --> 00:06:06,980 Hi. Jina langu ni Jason. 109 00:06:06,980 --> 00:06:09,120 Kama sisi kupiga mbizi katika printer.c, 110 00:06:09,120 --> 00:06:13,570 tunaona kwamba mengi ya code inaonekana sawa na kile sisi tu kutembea kupitia katika typewriter.c. 111 00:06:13,570 --> 00:06:16,720 Hakika mstari 22, ambapo sisi kufunguliwa faili, 112 00:06:16,720 --> 00:06:19,220 na mstari 39, ambapo sisi kufungwa faili, 113 00:06:19,220 --> 00:06:23,890 ni wawili karibu sawa na typewriter.c, ila kwa ubishi fopen pili. 114 00:06:23,890 --> 00:06:26,510 Hii wakati sisi ni kusoma kutoka faili, 115 00:06:26,510 --> 00:06:29,040 hivyo tumechagua r badala ya w. 116 00:06:29,040 --> 00:06:31,950 Hivyo, hebu kuzingatia sehemu ya pili ya mchakato. 117 00:06:31,950 --> 00:06:36,060 Katika mstari 35, kama hali ya pili katika kitanzi wetu 4, 118 00:06:36,060 --> 00:06:38,590 sisi kufanya wito kwa fgets, 119 00:06:38,590 --> 00:06:42,190 kazi kwa rafiki fputs kutoka kabla. 120 00:06:42,190 --> 00:06:44,660 Hii wakati tuna hoja tatu. 121 00:06:44,660 --> 00:06:48,810 kwanza ni pointer safu ya wahusika ambapo string itahifadhiwa. 122 00:06:48,810 --> 00:06:52,670 pili ni upeo wa idadi ya wahusika kuwa kusoma. 123 00:06:52,670 --> 00:06:56,010 Na tatu ni pointer faili ambayo sisi ni kazi. 124 00:06:56,010 --> 00:07:00,780 Utagundua kuwa kwa kitanzi mwisho wakati fgets anarudi null. 125 00:07:00,780 --> 00:07:02,940 Kuna sababu mbili kwamba hii inaweza kuwa kilichotokea. 126 00:07:02,940 --> 00:07:05,380 Kwanza, kosa inaweza kuwa imetokea. 127 00:07:05,380 --> 00:07:10,740 Pili, na uwezekano mkubwa zaidi, mwisho wa faili ulifikiwa na wahusika hakuna zaidi walikuwa kusoma. 128 00:07:10,740 --> 00:07:14,040 Katika kesi wewe wanashangaa, majukumu mawili ya kufanya kuwepo kwamba kuruhusu sisi kuwaambia 129 00:07:14,040 --> 00:07:17,160 ambayo sababu ni sababu ya pointer hasa hili null. 130 00:07:17,160 --> 00:07:21,090 Na, si ya kushangaza, kwa vile wao kufanya na kufanya kazi na files, 131 00:07:21,090 --> 00:07:26,940 wote kazi na kuanza ferror feof kazi pamoja na f barua. 132 00:07:26,940 --> 00:07:32,130 >> Hatimaye, kabla ya sisi kuhitimisha, moja ya haraka ya note kuhusu mwisho wa kazi ya SVG, 133 00:07:32,130 --> 00:07:36,690 ambayo, kama tu zilizotajwa, imeandikwa kama feof. 134 00:07:36,690 --> 00:07:41,550 Mara nyingi utapata mwenyewe kwa kutumia wakati na kwa matanzi kwa kuendelea kusoma njia yako kupitia files. 135 00:07:41,550 --> 00:07:45,790 Hivyo, itabidi njia ya kumaliza matanzi haya baada ya kufikia mwisho wa files haya. 136 00:07:45,790 --> 00:07:50,510 Wito feof kwenye faili pointer yako na kuangalia kuona kama ni kweli 137 00:07:50,510 --> 00:07:52,310 ingekuwa kufanya tu. 138 00:07:52,310 --> 00:07:59,820 Hivyo, kitanzi wakati na hali (! Feof (fp)) inaweza kuonekana kama ufumbuzi kikamilifu sahihi. 139 00:07:59,820 --> 00:08:03,770 Hata hivyo, wanasema sisi moja line kushoto katika Nakala faili wetu. 140 00:08:03,770 --> 00:08:07,130 Tutaweza kuingia wakati wetu kitanzi na kila kitu kazi nje kama ilivyopangwa. 141 00:08:07,130 --> 00:08:12,750 On duru ijayo kupitia, mpango wetu kuangalia kuona kama feof ya fp ni kweli, 142 00:08:12,750 --> 00:08:15,430 lakini - na hii ni hatua muhimu kuelewa hapa - 143 00:08:15,430 --> 00:08:17,770 itakuwa si kweli bado tu. 144 00:08:17,770 --> 00:08:21,110 Hiyo ni kwa sababu madhumuni ya feof si kuangalia 145 00:08:21,110 --> 00:08:24,400 kama wito ijayo kazi kusoma nitawatwangeni mwisho wa faili, 146 00:08:24,400 --> 00:08:28,190 lakini badala ya kuangalia kama au mwisho wa faili tayari kufikiwa. 147 00:08:28,190 --> 00:08:30,140 Katika kesi ya mfano huu, 148 00:08:30,140 --> 00:08:32,780 kusoma mstari wa mwisho wa faili wetu unaendelea vizuri kikamilifu, 149 00:08:32,780 --> 00:08:36,210 lakini haina mpango bado kujua kwamba tumekuwa hit mwisho wa faili wetu. 150 00:08:36,210 --> 00:08:40,549 Siyo mpaka ni gani moja ya ziada kusoma kwamba counters mwisho wa faili. 151 00:08:40,549 --> 00:08:43,210 Hivyo, hali sahihi itakuwa zifuatazo: 152 00:08:43,210 --> 00:08:49,330 fgets na hoja yake ya tatu - pato, na ukubwa wa pato, na fp - 153 00:08:49,330 --> 00:08:52,570 na yote ya kwamba si sawa na null. 154 00:08:52,570 --> 00:08:55,260 Hii ni mbinu ya sisi alichukua katika printer.c, 155 00:08:55,260 --> 00:08:57,890 na katika kesi hii, baada ya exits kitanzi, 156 00:08:57,890 --> 00:09:04,290 unaweza kuita feof au ferror kuwajulisha mtumiaji kama hoja maalum kwa exiting hii kitanzi. 157 00:09:04,290 --> 00:09:08,100 >> Kuandika ili na kusoma kutoka faili ni, katika msingi wake mkubwa, 158 00:09:08,100 --> 00:09:10,150 rahisi 3-sehemu ya mchakato. 159 00:09:10,150 --> 00:09:12,530 Kwanza, sisi kufungua faili. 160 00:09:12,530 --> 00:09:16,740 Pili, sisi kuweka baadhi ya mambo ndani ya faili wetu au kuchukua baadhi ya mambo nje ya hiyo. 161 00:09:16,740 --> 00:09:19,200 Tatu, tuna karibu faili. 162 00:09:19,200 --> 00:09:21,170 sehemu ya kwanza na ya mwisho ni rahisi. 163 00:09:21,170 --> 00:09:23,920 sehemu ya katikati ni ambapo mambo Tricky uongo. 164 00:09:23,920 --> 00:09:27,760 Na ingawa chini ya Hood tuko daima kushughulika na mlolongo mrefu wa zeros na ndio, 165 00:09:27,760 --> 00:09:30,710 ni msaada gani wakati coding kuongeza safu ya uchukuaji 166 00:09:30,710 --> 00:09:35,350 kwamba anarudi mlolongo katika kitu ambacho karibu zaidi liknar kile sisi ni kutumika kuona. 167 00:09:35,350 --> 00:09:39,570 Kwa mfano, kama sisi ni kufanya kazi na faili 24-bit bitmap, 168 00:09:39,570 --> 00:09:43,290 tutaweza uwezekano kuwa kusoma au kuandika ka tatu kwa wakati mmoja. 169 00:09:43,290 --> 00:09:46,450 Katika kesi ambayo, inaweza kuleta hisia ya kufafanua na ipasavyo jina 170 00:09:46,450 --> 00:09:48,980 struct kwamba ni 3 ka kubwa. 171 00:09:48,980 --> 00:09:51,410 >> Ingawa kazi na files inaweza kuonekana ngumu, 172 00:09:51,410 --> 00:09:54,530 kutumia yao inaruhusu sisi kufanya kitu kweli ya ajabu. 173 00:09:54,530 --> 00:09:58,880 Tunaweza kubadili hali ya dunia ya nje ya mpango wetu, 174 00:09:58,880 --> 00:10:01,730 tunaweza kutengeneza kitu ambacho anaishi baada ya maisha ya mpango wetu, 175 00:10:01,730 --> 00:10:07,190 au tunaweza hata kubadili kitu kwamba iliundwa kabla ya mpango wetu kuanza mbio. 176 00:10:07,190 --> 00:10:11,210 Kushirikiana na files ni sehemu ya programu kweli nguvu katika C. 177 00:10:11,210 --> 00:10:15,300 na mimi nina msisimko kwa kuona nini wewe kwenda kujenga na hayo katika code ijayo. 178 00:10:15,300 --> 00:10:19,770 Jina langu ni Jason Hirschhorn. Hii ni CS50. 179 00:10:19,770 --> 00:10:21,770 [CS50.TV] 180 00:10:21,770 --> 00:10:25,940 >> [Kicheko] 181 00:10:25,940 --> 00:10:29,330 Sawa. Moja kuchukua. Hapa sisi kwenda. 182 00:10:49,000 --> 00:10:52,140 Tunapofikiria faili - >> Oh, ngoja. Sorry. 183 00:10:52,140 --> 00:10:56,800 [Kicheko] Sawa. 184 00:11:06,620 --> 00:11:09,970 Hey huko. 185 00:11:13,670 --> 00:11:16,310 Tunapofikiria faili - 186 00:11:17,610 --> 00:11:20,710 Wakati unafikiri ya faili - Sawa. Niambie wakati uko tayari. 187 00:11:20,710 --> 00:11:22,520 Oh, kubwa. 188 00:11:22,520 --> 00:11:26,180 Ingawa kusoma kutoka teleprompter inaweza kuonekana - hapana. Yangu mbaya.