[Powered by Google Translate] [Faili I / O] [Jason Hirschhorn, Chuo Kikuu cha Harvard] [Hii ni CS50, CS50.TV] Tunapofikiria faili, nini inakuja akilini ni Neno Microsoft hati, JPEG picha, au wimbo MP3, na sisi kushirikiana na kila ya aina hii ya files katika njia tofauti. Kwa mfano, katika hati Neno sisi kuongeza Nakala wakati na picha JPEG tupate mazao nje edges au retouch rangi. Hata hivyo chini ya Hood aina ya files katika kompyuta yetu ni kitu zaidi kuliko mlolongo mrefu wa zeros na ndio. Ni juu ya maombi maalum ambayo inaingiliana na faili kuamua jinsi mchakato huu mlolongo mrefu na sasa ni kwa mtumiaji. Kwa upande mmoja, hati inaweza kuangalia saa tu Byte moja, au 8 zeros na ndio, na kuonyesha tabia ASCII kwenye screen. Kwa upande mwingine, picha bitmap wanaweza kuangalia ka 3, au 24 zeros na ndio, na kutafsiri yao kama namba 3 hexadesimoli kwamba kuwakilisha maadili kwa nyekundu, kijani, na bluu katika moja ya pixel ya picha. Chochote wanaweza kuangalia kama kwenye kioo, saa yao ya msingi, files ni kitu zaidi kuliko mlolongo wa zeros na ndio. Hivyo hebu kupiga mbizi katika na kuangalia jinsi sisi kweli kuendesha zeros haya na ndio linapokuja kuandika na kusoma kutoka faili. Mimi itabidi kuanza kwa kuvunja chini katika mchakato rahisi 3-sehemu. Next, mimi itabidi kupiga mbizi katika mifano code mbili kwamba kuonyesha sehemu hizi tatu. Mwisho, mimi utakagua mchakato na baadhi ya maelezo yake muhimu. Kama na faili yoyote aketiye juu ya desktop yako, Kitu cha kwanza kufanya ni kufungua hiyo. Katika C tunafanya hili kwa kutangaza pointer struct predefined kwamba inawakilisha faili kwenye disk. Katika wito kazi hii, sisi pia kuamua kama tunataka kuandika au kusoma kutoka faili. Next, sisi kufanya kusoma halisi na kuandika. Kuna idadi ya kazi maalumu tunaweza kutumia katika sehemu hii, na karibu wote wa kwao kuanza na F barua, ambayo inasimamia kwa faili. Mwisho, sawa na kidogo X nyekundu katika kona ya juu ya files kufungua kwenye kompyuta yako, sisi karibu faili na wito wa mwisho kazi. Sasa kwa kuwa tuna wazo jumla ya nini tunakwenda kufanya, hebu tuzame katika kanuni. Katika orodha hii, tuna mbili files C na files zao sambamba kutekelezwa. mpango typewriter inachukua moja ya mstari amri hoja, jina la hati tunataka kujenga. Katika kesi hii, tutaweza kuiita doc.txt. Hebu kuendesha programu na kuingia michache ya mistari. Hi. Jina langu ni Jason. Hatimaye, tutaweza aina "quit." Kama sisi sasa orodha yote ya files katika saraka hii, tunaona kwamba hati mpya iliopo kuitwa doc.txt. Hiyo faili mpango huu tu kuundwa. Na bila shaka, hiyo pia ni kitu zaidi kuliko mlolongo mrefu wa zeros na ndio. Kama sisi kufungua faili hii mpya, tunaona mistari 3 ya maadili ya sisi aliingia katika mpango wetu - Hi. Mei jina ni Jason. Lakini nini hasa kinachoendelea wakati typewriter.c anaendesha? mstari wa kwanza wa maslahi kwa ajili yetu ni mstari 24. Katika mstari huu, sisi kutangaza faili wetu pointer. kazi kwamba anarudi hii pointer, fopen, inachukua hoja mbili. kwanza ni jina la faili ikiwa ni pamoja na ugani faili kama inafaa. Kumbuka kwamba faili ugani haina ushawishi faili katika ngazi ya chini yake. Sisi ni daima kushughulika na mlolongo mrefu wa zeros na ndio. Lakini haina ushawishi jinsi files ni kufasiriwa na maombi yale ni kutumika kufungua yao. Hoja ya pili fopen ni barua moja kwamba anasimama kwa nini sisi mpango wa kufanya baada ya sisi kufungua faili. Kuna chaguzi tatu kwa hoja hii - W, R, na A. Tumekuwa wateule w katika kesi hii kwa sababu tunataka kuandika kwenye faili. R, kama pengine unaweza nadhani, ni kwa ajili ya kusoma na faili. Na ni kwa appending na faili. Wakati wote w na inaweza kutumika kwa ajili ya kuandika kwa files, w kuanza kuandika tangu mwanzo wa faili na uwezekano wa overwrite data yoyote ambayo awali imekuwa kuhifadhiwa. By default, faili sisi kufungua, ikiwa haina tayari zipo, ni umba katika saraka yetu ya sasa ya kazi. Hata hivyo, kama tunataka kupata au kuunda faili katika eneo tofauti, katika hoja ya kwanza ya fopen, tunaweza kutaja Njia ya faili pamoja na jina la faili. Wakati sehemu ya kwanza ya mchakato huu ni moja tu mstari wa kanuni ya muda mrefu, mara nyingi ni vizuri mazoezi ya pamoja na kuweka mwingine wa mistari kwamba kuangalia kuhakikisha kwamba faili ya mara kwa mafanikio kufunguliwa au kuundwa. Kama fopen anarudi null, sisi si unataka kuendelea na mpango wetu, na hii inaweza kutokea kama mfumo wa uendeshaji ni nje ya kumbukumbu au kama sisi kujaribu kufungua faili katika saraka ambayo hatukuwa na permissions sahihi. Sehemu ya pili ya mchakato unafanyika katika wakati typewriter kitanzi cha. Sisi kutumia CS50 maktaba kazi kupata mawazo kutoka kwa mtumiaji, na kuchukua wao hawataki kuacha mpango, sisi kutumia fputs kazi kuchukua kamba na kuandika ni kwa faili. fputs ni moja tu ya kazi nyingi tunaweza kutumia kuandika kwenye faili. Wengine ni pamoja na fwrite, fputc, na hata fprintf. Bila kujali kazi fulani sisi kuishia kutumia, ingawa, wote haja ya kujua, kupitia hoja zao, angalau mambo mawili - nini mahitaji ya kuwa imeandikwa na ambapo inahitaji kuwa imeandikwa na. Katika kesi yetu, pembejeo ni string kwamba mahitaji ya kuwa imeandikwa na fp ni pointer kwamba kutuelekeza ambapo sisi ni kuandika. Katika mpango huu, sehemu ya pili ya mchakato ni badala ya moja kwa moja. Sisi ni tu kuchukua string kutoka kwa mtumiaji na kuongeza kuwa moja kwa moja na faili wetu na kidogo-kwa-hakuna uthibitisho pembejeo au hundi ya usalama. Mara nyingi, hata hivyo, sehemu mbili itachukua juu ya wingi wa code yako. Hatimaye, sehemu tatu ni juu ya mstari 58, ambapo sisi karibu faili. Hapa sisi kuwaita fclose na kupita faili yetu ya awali pointer. Katika mstari baadae, sisi kurudi sifuri kumuashiria mwisho wa programu yetu. Na, ndio, sehemu tatu ni rahisi kama hayo. Hebu hoja juu ya kusoma kutoka files. Nyuma katika saraka yetu tuna faili inayoitwa printer.c. Hebu kukimbia kwa faili sisi tu umba - doc.txt. Mpango huu, kama jina linavyosema, mapenzi tu magazeti nje ya yaliyomo ya faili kupita humo. Na kuna sisi kuwa nayo. mstari wa kanuni tulikuwa typed mapema na kuokolewa katika doc.txt. Hi. Jina langu ni Jason. Kama sisi kupiga mbizi katika printer.c, tunaona kwamba mengi ya code inaonekana sawa na kile sisi tu kutembea kupitia katika typewriter.c. Hakika mstari 22, ambapo sisi kufunguliwa faili, na mstari 39, ambapo sisi kufungwa faili, ni wawili karibu sawa na typewriter.c, ila kwa ubishi fopen pili. Hii wakati sisi ni kusoma kutoka faili, hivyo tumechagua r badala ya w. Hivyo, hebu kuzingatia sehemu ya pili ya mchakato. Katika mstari 35, kama hali ya pili katika kitanzi wetu 4, sisi kufanya wito kwa fgets, kazi kwa rafiki fputs kutoka kabla. Hii wakati tuna hoja tatu. kwanza ni pointer safu ya wahusika ambapo string itahifadhiwa. pili ni upeo wa idadi ya wahusika kuwa kusoma. Na tatu ni pointer faili ambayo sisi ni kazi. Utagundua kuwa kwa kitanzi mwisho wakati fgets anarudi null. Kuna sababu mbili kwamba hii inaweza kuwa kilichotokea. Kwanza, kosa inaweza kuwa imetokea. Pili, na uwezekano mkubwa zaidi, mwisho wa faili ulifikiwa na wahusika hakuna zaidi walikuwa kusoma. Katika kesi wewe wanashangaa, majukumu mawili ya kufanya kuwepo kwamba kuruhusu sisi kuwaambia ambayo sababu ni sababu ya pointer hasa hili null. Na, si ya kushangaza, kwa vile wao kufanya na kufanya kazi na files, wote kazi na kuanza ferror feof kazi pamoja na f barua. Hatimaye, kabla ya sisi kuhitimisha, moja ya haraka ya note kuhusu mwisho wa kazi ya SVG, ambayo, kama tu zilizotajwa, imeandikwa kama feof. Mara nyingi utapata mwenyewe kwa kutumia wakati na kwa matanzi kwa kuendelea kusoma njia yako kupitia files. Hivyo, itabidi njia ya kumaliza matanzi haya baada ya kufikia mwisho wa files haya. Wito feof kwenye faili pointer yako na kuangalia kuona kama ni kweli ingekuwa kufanya tu. Hivyo, kitanzi wakati na hali (! Feof (fp)) inaweza kuonekana kama ufumbuzi kikamilifu sahihi. Hata hivyo, wanasema sisi moja line kushoto katika Nakala faili wetu. Tutaweza kuingia wakati wetu kitanzi na kila kitu kazi nje kama ilivyopangwa. On duru ijayo kupitia, mpango wetu kuangalia kuona kama feof ya fp ni kweli, lakini - na hii ni hatua muhimu kuelewa hapa - itakuwa si kweli bado tu. Hiyo ni kwa sababu madhumuni ya feof si kuangalia kama wito ijayo kazi kusoma nitawatwangeni mwisho wa faili, lakini badala ya kuangalia kama au mwisho wa faili tayari kufikiwa. Katika kesi ya mfano huu, kusoma mstari wa mwisho wa faili wetu unaendelea vizuri kikamilifu, lakini haina mpango bado kujua kwamba tumekuwa hit mwisho wa faili wetu. Siyo mpaka ni gani moja ya ziada kusoma kwamba counters mwisho wa faili. Hivyo, hali sahihi itakuwa zifuatazo: fgets na hoja yake ya tatu - pato, na ukubwa wa pato, na fp - na yote ya kwamba si sawa na null. Hii ni mbinu ya sisi alichukua katika printer.c, na katika kesi hii, baada ya exits kitanzi, unaweza kuita feof au ferror kuwajulisha mtumiaji kama hoja maalum kwa exiting hii kitanzi. Kuandika ili na kusoma kutoka faili ni, katika msingi wake mkubwa, rahisi 3-sehemu ya mchakato. Kwanza, sisi kufungua faili. Pili, sisi kuweka baadhi ya mambo ndani ya faili wetu au kuchukua baadhi ya mambo nje ya hiyo. Tatu, tuna karibu faili. sehemu ya kwanza na ya mwisho ni rahisi. sehemu ya katikati ni ambapo mambo Tricky uongo. Na ingawa chini ya Hood tuko daima kushughulika na mlolongo mrefu wa zeros na ndio, ni msaada gani wakati coding kuongeza safu ya uchukuaji kwamba anarudi mlolongo katika kitu ambacho karibu zaidi liknar kile sisi ni kutumika kuona. Kwa mfano, kama sisi ni kufanya kazi na faili 24-bit bitmap, tutaweza uwezekano kuwa kusoma au kuandika ka tatu kwa wakati mmoja. Katika kesi ambayo, inaweza kuleta hisia ya kufafanua na ipasavyo jina struct kwamba ni 3 ka kubwa. Ingawa kazi na files inaweza kuonekana ngumu, kutumia yao inaruhusu sisi kufanya kitu kweli ya ajabu. Tunaweza kubadili hali ya dunia ya nje ya mpango wetu, tunaweza kutengeneza kitu ambacho anaishi baada ya maisha ya mpango wetu, au tunaweza hata kubadili kitu kwamba iliundwa kabla ya mpango wetu kuanza mbio. Kushirikiana na files ni sehemu ya programu kweli nguvu katika C. na mimi nina msisimko kwa kuona nini wewe kwenda kujenga na hayo katika code ijayo. Jina langu ni Jason Hirschhorn. Hii ni CS50. [CS50.TV] [Kicheko] Sawa. Moja kuchukua. Hapa sisi kwenda. Tunapofikiria faili - >> Oh, ngoja. Sorry. [Kicheko] Sawa. Hey huko. Tunapofikiria faili - Wakati unafikiri ya faili - Sawa. Niambie wakati uko tayari. Oh, kubwa. Ingawa kusoma kutoka teleprompter inaweza kuonekana - hapana. Yangu mbaya.