[Powered by Google Translate] [Ffeil I / O] [Jason Hirschhorn, Prifysgol Harvard] [Mae hyn yn CS50, CS50.TV] Pan fyddwn yn meddwl am ffeil, beth sy'n dod i'r meddwl yn ddogfen Word Microsoft, a, delwedd JPEG neu gân MP3, ac rydym yn rhyngweithio gyda phob un o'r mathau hyn o ffeiliau mewn ffyrdd gwahanol. Er enghraifft, mewn dogfen Word rydym yn ychwanegu testun tra gyda delwedd JPEG gallem cnwd allan yr ymylon neu retouch y lliwiau. Eto i gyd o dan y cwfl holl ffeiliau yn ein cyfrifiadur yn ddim mwy na dilyniant hir o sero a rhai. Mae i fyny i'r cais penodol sy'n rhyngweithio gyda'r ffeil i benderfynu sut i brosesu dilyniant hwn o hyd a'i gyflwyno i'r defnyddiwr. Ar y naill law, gall dogfen yn edrych ar un beit, neu 8 zeros a rhai, ac yn dangos cymeriad ASCII ar y sgrin. Ar y llaw arall, efallai y delwedd bitmap yn edrych ar 3 bytes, neu 24 zeros a rhai, ac yn eu dehongli fel 3 rhif hecsadegol sy'n cynrychioli'r gwerthoedd ar gyfer coch, gwyrdd, a glas mewn un picsel o ddelwedd. Beth bynnag maent yn edrych fel ar eich sgrîn, yn eu hanfod, ffeiliau yn ddim mwy na dilyniant o sero a rhai. Felly gadewch i ni neidio i mewn ac edrych ar sut yr ydym mewn gwirionedd yn trin y seroau a rhai pan ddaw i ysgrifennu ar a darllen o ffeil. Byddaf yn dechrau drwy ei dorri i lawr i mewn i syml 3-rhan broses. Nesaf, 'n annhymerus' plymio i mewn i ddwy enghraifft cod sy'n dangos y tair rhan. Yn olaf, byddaf yn adolygu'r broses a rhai o'r manylion mwyaf pwysig. Fel gydag unrhyw ffeil sy'n eistedd ar eich bwrdd gwaith, y peth cyntaf i'w wneud yw i agor. Yn C rydym yn gwneud hyn trwy ddatgan pwyntydd i strwythur rhagosodol sy'n cynrychioli ffeil ar ddisg. Yn y galwad swyddogaeth, rydym hefyd yn penderfynu a ydym am ysgrifennu at neu ddarllen o'r ffeil. Nesaf, rydym yn gwneud y darlleniad gwirioneddol ac ysgrifennu. Mae yna nifer o swyddogaethau arbenigol gallwn eu defnyddio yn y rhan hon, ac mae bron pob un ohonynt yn dechrau gyda, F llythyr sy'n sefyll am ffeil. Diwethaf, yn debyg i'r X bach coch yn y gornel uchaf y ffeiliau ar agor ar eich cyfrifiadur, rydym yn cau'r ffeil gyda galwad swyddogaeth terfynol. Nawr bod gennym syniad cyffredinol o'r hyn yr ydym ni'n mynd i'w wneud, gadewch i blymio i mewn i'r cod. Yn y cyfeiriadur, mae gennym ddwy ffeil C a'u ffeiliau gweithredadwy cyfatebol. Mae'r rhaglen teipiadur yn cymryd un ymresymiad llinell orchymyn, enw'r ddogfen yr ydym am ei chreu. Yn yr achos hwn, byddwn yn ei alw'n doc.txt. Gadewch i ni redeg y rhaglen a rhowch ychydig o linellau. Hi. Fy enw i yw Jason. Yn olaf, byddwn yn deipio "rhoi'r gorau iddi." Os ydym yn awr yn rhestru'r holl ffeiliau yn y cyfeiriadur hwn, rydym yn gweld bod dogfen newydd yn bodoli o'r enw doc.txt. Dyna y ffeil y rhaglen hon newydd ei greu. Ac wrth gwrs, mae hwn hefyd yn ddim mwy na dilyniant hir o sero a rhai. Os byddwn yn agor y ffeil newydd, rydym yn gweld y 3 llinell o god rydym yn ymrwymo i ein rhaglen - Hi. Mai enw i yw Jason. Ond beth sy'n digwydd mewn gwirionedd pan typewriter.c yn rhedeg? Mae'r llinell gyntaf o ddiddordeb i ni yw llinell 24. Yn y llinell hon, rydym yn datgan ein pwyntydd ffeil. Mae'r swyddogaeth sy'n dychwelyd y pwyntydd, fopen, yn cymryd dwy ddadl. Y cyntaf yw enw'r ffeil yn cynnwys y estyniad ffeil os yw hynny'n briodol. Dwyn i gof nad yw estyniad ffeil yn dylanwadu ar y ffeil ar ei lefel isaf. Rydym bob amser yn delio gyda dilyniant hir o sero a rhai. Ond mae'n dylanwadu ar sut y ffeiliau yn cael eu dehongli a pa geisiadau yn cael eu defnyddio i agor iddynt. Yr ail ddadl i fopen yn un llythyren sy'n sefyll am yr hyn rydym yn bwriadu ei wneud ar ôl i ni agor y ffeil. Mae tri opsiwn ar gyfer y ddadl hon - W, R, ac A. Rydym wedi dewis w yn yr achos hwn oherwydd ein bod eisiau i ysgrifennu at y ffeil. R, fel y mae'n debyg y gallwch ddyfalu, ar gyfer darllen y ffeil. A yw atodi i'r ffeil. Er bod y ddau w a gall gael ei ddefnyddio ar gyfer ysgrifennu at ffeiliau, Bydd w yn dechrau ysgrifennu o ddechrau y ffeil ac o bosibl yn trosysgrifo unrhyw ddata sydd eisoes wedi cael ei storio. Yn ddiofyn, y ffeil yn agor, os nad yw eisoes yn bodoli, yn cael ei greu yn ein cyfeiriadur gwaith presennol. Fodd bynnag, os ydym am gael mynediad neu greu ffeil mewn lleoliad gwahanol, yn y ddadl gyntaf fopen, efallai y byddwn yn nodi llwybr ffeil yn ogystal ag enw'r ffeil. Er bod y rhan gyntaf o'r broses hon yw mai dim ond un llinell o god hir, mae bob amser yn arfer da i gynnwys set arall o linellau bod yn gwirio i sicrhau bod y ffeil yn agor yn llwyddiannus neu eu creu. Os fopen dychwelyd null, ni fyddem am i fwrw ymlaen â'n rhaglen, a gall hyn ddigwydd os bydd y system yn gweithredu allan o gof neu os ydym yn ceisio agor ffeil mewn cyfeiriadur lle nad oedd gennym y caniatâd priodol. Rhan dau o'r broses yn digwydd mewn dolen tra teipiadur yn. Rydym yn defnyddio CS50 swyddogaeth llyfrgell i gael mewnbwn gan y defnyddiwr, a chan dybio nad ydynt am i roi'r gorau i'r rhaglen, rydym yn defnyddio'r fputs swyddogaeth i gymryd y llinyn ac ysgrifennwch at y ffeil. fputs dim ond un o'r llawer o swyddogaethau gallem eu defnyddio i ysgrifennu at y ffeil. Mae eraill yn cynnwys fwrite, fputc, a hyd yn oed fprintf. Waeth beth fo'r swyddogaeth benodol, rydym yn y pen draw gan ddefnyddio, fodd bynnag, pob un ohonynt angen i chi wybod, drwy eu dadleuon, o leiaf ddau beth - beth sydd angen i gael ei ysgrifennu a lle mae angen i gael ei ysgrifennu i. Yn ein hachos ni, mewnbwn yn y llinyn sydd angen i gael ei ysgrifennu ac fp yw'r pwyntydd sy'n cyfarwyddo ni i ble'r ydym ni'n ysgrifennu. Yn y rhaglen hon, rhan dau y broses braidd yn syml. Yn syml, rydym yn cymryd llinyn gan y defnyddiwr a'i ychwanegu yn uniongyrchol at ein ffeil gyda bach-i-ddim dilysu mewnbwn neu gwiriadau diogelwch. Yn aml, fodd bynnag, bydd rhan dau manteisio ar y rhan fwyaf o'r eich cod. Yn olaf, rhan tri ar linell 58, lle rydym yn cau'r ffeil. Yma, rydym yn galw mmap a'i drosglwyddo ein pwyntydd ffeil gwreiddiol. Yn y llinell ddilynol, byddwn yn dychwelyd sero, gan nodi diwedd ein rhaglen. Ac, ie, rhan tri mor syml â hynny. Gadewch i ni symud ymlaen i ddarllen o ffeiliau. Yn ôl yn ein cyfeiriadur gennym ffeil o'r enw printer.c. Gadewch i ni redeg gyda'r ffeil ydym yn unig greu - doc.txt. Mae'r rhaglen hon, fel mae'r enw yn awgrymu y bydd, yn syml argraffwch y cynnwys y ffeil drosglwyddo iddo. Ac mae gennym. Mae'r llinellau o god rydym wedi teipio yn gynharach a'u cadw ar doc.txt. Hi. Fy enw i yw Jason. Os byddwn yn plymio i mewn i printer.c, rydym yn gweld bod llawer o'r cod yn edrych yn debyg i'r hyn yr ydym yn cerdded trwy yng typewriter.c. Yn wir llinell 22, lle rydym yn agor y ffeil, a llinell 39, lle rydym yn cau y ffeil, yn y ddau bron yn union yr un fath typewriter.c, cynilo ar gyfer dadl fopen ail. Y tro hwn rydym yn darllen o ffeil, felly rydym wedi dewis yn hytrach na r w. Felly, gadewch i ni ganolbwyntio ar ail ran y broses. Yn llinell 35, fel yr ail amod yn ein 4 ddolen, rydym yn gwneud galwad i fgets, y swyddogaeth cydymaith i fputs o'r blaen. Y tro hwn mae gennym dri dadleuon. Y cyntaf yw y pwyntydd i amrywiaeth o gymeriadau lle bydd y llinyn yn cael ei storio. Yr ail yw'r nifer mwyaf o gymeriadau i'w darllen. A'r trydydd yw pwyntydd i'r ffeil yr ydym yn gweithio. Byddwch yn sylwi bod y ddolen ar gyfer dod i ben pan fgets dychwelyd null. Mae dau reswm y gallai hyn fod wedi digwydd. Yn gyntaf, efallai y gwall wedi digwydd. Yn ail, ac yn fwy tebygol, ar ddiwedd y ffeil ei gyrraedd a chymeriadau dim mwy yn cael eu darllen. Yn achos yr ydych chi'n meddwl, ddwy swyddogaeth yn bodoli yn ein galluogi i ddweud y rheswm yw achos ar gyfer y pwyntydd null penodol. Ac, nid yw'n syndod, gan fod rhaid iddynt ei wneud â gweithio gyda ffeiliau, y swyddogaeth ferror a dechrau'r swyddogaeth feof gyda'r f llythyr. Yn olaf, cyn i ni ddod i'r casgliad, un nodyn sydyn tua diwedd y swyddogaeth ffeil, sydd, fel y crybwyllwyd yn unig, yn cael ei ysgrifennu fel feof. Yn aml byddwch yn dod o hyd i eich hun gan ddefnyddio wrth ac ar gyfer dolenni i raddol darllen eich ffordd drwy'r ffeiliau. Felly, bydd angen ffordd i roi terfyn ar y dolenni ar ôl i chi gyrraedd diwedd y ffeiliau hyn. Galw feof ar eich pwyntydd ffeil a gwirio i weld os yw'n wir Byddai gwneud hynny. Felly, gallai dolen gyfnod gyda chyflwr (! Feof (fp)) yn ymddangos fel ateb gwbl briodol. Fodd bynnag, yn dweud mae gennym un llinell ar ôl yn ein ffeil testun. Byddwn yn mynd i mewn ein dolen tra a bydd popeth yn gweithio fel y bwriadwyd. Ar y rownd nesaf trwy, bydd ein rhaglen yn edrych i weld os feof o fp yn wir, ond - a dyma'r pwynt allweddol i ddeall yma - ni fydd yn wir eto. Mae hyn oherwydd nad yw'r diben feof yw gwirio os bydd yr alwad nesaf at swyddogaeth ddarllen daro diwedd y ffeil, ond yn hytrach i wirio a yw diwedd y ffeil eisoes wedi'i gyrraedd. Yn achos yr enghraifft hon, ddarllen y llinell olaf ein ffeil yn mynd yn berffaith llyfn, ond nid yw'r rhaglen yn gwybod eto ein bod wedi cyrraedd diwedd ein ffeil. Dyw hi ddim hyd nes ei fod mae un ddarllen ychwanegol ei fod yn cownteri ar ddiwedd y ffeil. Felly, byddai amod cywir yn y canlynol: fgets a'i dair dadleuon - allbwn, maint y cynnyrch, a fp - a hynny i gyd ddim yn hafal i null. Dyma'r dull rydym yn cymryd yn printer.c, ac yn yr achos hwn, ar ôl y ddolen allanfeydd, gallech ffonio feof neu ferror i hysbysu'r defnyddiwr am y rhesymau penodol ar gyfer gadael y ddolen. Ysgrifennu at a darllen o ffeil yw, ar ei mwyaf sylfaenol, syml 3-rhan broses. Yn gyntaf, rydym yn agor y ffeil. Yn ail, rydym yn rhoi rhai pethau yn ein ffeil neu gymryd rhai pethau allan ohono. Yn drydydd, rydym yn cau'r ffeil. Mae'r rhannau cyntaf a'r olaf yn hawdd. Mae'r rhan ganol yw pan fo pethau anodd yn gorwedd. Ac er o dan y cwfl rydym bob amser yn delio gyda dilyniant hir o zeros a rhai, mae'n helpu wrth godio i ychwanegu haen o dynnu sy'n troi y dilyniant i mewn i rywbeth sy'n debycach hyn yr ydym ni'n arfer gweld. Er enghraifft, os ydym yn gweithio gyda ffeil bitmap 24-bit, byddwn yn debygol o fod yn darllen neu ysgrifennu 3 bytes ar y tro. Os felly, byddai'n gwneud synnwyr i ddiffinio ac yn briodol enwi a strwythur sydd 3 bytes mawr. Er y gall gweithio gyda ffeiliau ymddangos yn gymhleth, defnyddio yn eu caniatáu i ni wneud rhywbeth gwirioneddol ryfeddol. Gallwn newid y cyflwr y byd y tu allan ein rhaglen, gallwn greu rhywbeth sy'n byw y tu hwnt i fywyd ein rhaglen, neu gallwn hyd yn oed newid rhywbeth a oedd yn creu cyn ein rhaglen ddechrau rhedeg. Rhyngweithio gyda ffeiliau yn rhan wirioneddol pwerus o raglenni mewn C. ac rwy'n edrych ymlaen i weld beth rydych chi'n mynd i greu ag ef yn y cod i ddod. Fy enw i yw Jason Hirschhorn. Mae hyn yn CS50. [CS50.TV] [Chwerthin] Iawn. Un cymryd. Yma rydym yn mynd. Pan fyddwn yn meddwl am ffeil - >> O, aros. Mae'n ddrwg gennym. [Chwerthin] Iawn. Hey yno. Pan fyddwn yn meddwl am ffeil - Pan fyddwch yn meddwl o ffeil - Iawn. Dywedwch wrthyf pan fyddwch yn barod. O, gwych. Er y gall darllen o teleprompter ymddangos - dim. Fy ddrwg.