[Powered by Google Translate] [Dosiera / S] [Jason Hirschhorn, Harvard University] [Jen CS50, CS50.TV] Kiam ni pensas pri iu dosiero, kio venas al la menso estas Microsoft Word dokumento, a JPEG bildo, aŭ MP3 kanto, kaj ni interagas kun ĉiu de ĉi tiuj tipoj de dosieroj en malsamaj manieroj. Ekzemple, en Word dokumento ni aldonu teksto dum kun JPEG bildo ni povus okazi ekster la eĝoj aŭ retouch la koloroj. Sed sub la kapuĉo ĉiujn dosierojn en nia komputilo ne estas pli ol longa vico de nuloj kaj aĵoj. Ĝi dependas de la specifa apliko kiu interagas kun la dosiero decidi kiel procesi tiu longa vico kaj prezenti ĝin al la uzanto. Unuflanke, dokumento povas rigardi nur unu bajto, aŭ 8 nuloj kaj, kaj montri ASCII signo sur la ekrano. Aliflanke, oni bitmap image povas rigardi 3 bajtoj, aŭ 24 nuloj kaj, kaj interpreti ilin kiel 3 deksesuma nombro kiuj reprezentas la valoroj por ruĝa, verda, kaj blua en unu bildero de bildo. Kion ili povas aspekti en via ekrano, en ilia kerno, dosieroj estas nenio pli ol vico de nuloj kaj aĵoj. Do estu la plonĝi en kaj rigardi kiom ni efektive manipulas tiujn nuloj kaj kiam temas pri skribo por kaj legante de dosiero. Mi komencos per rompanta ĝi malsupren en simpla 3-parto procezo. Tuj poste, mi plonĝi en du kodo ekzemploj kiuj pruvas tiuj tri partoj. Fine, mi revizios la procezo kaj kelkaj el liaj plej gravaj detaloj. Kiel kun ajna dosiero, kiu sidas sur via labortablo, la unua afero por fari estas malfermi ĝin. En C ni faros ĉi deklarante puntero al predefinido struct kiu reprezentas dosieron sur diskon. En tiu funkcio alvoko, ni ankaŭ decidi ĉu ni volas skribi al aŭ legas de la dosiero. Poste, ni faru la realan legado kaj skribado. Ekzistas kelkaj specialigitaj funkcioj povas uzi en ĉi parto, kaj preskaŭ ĉiuj el ili komencas per la litero C, kiu staras por dosiero. Lasta, simila al la malgranda ruĝa X en la supro angulo de la dosieroj malfermi en via komputilo, ni fermas la dosieron kun fina funkcio nomita. Nun ke ni havas ĝeneralan ideon de tio, kion ni faros, ni pikita en la kodo. En ĉi tiu dosierujo, ni havas du C dosieroj kaj iliaj respondaj ruleblan dosierojn. La tajpilo programo prenas unu komandlinio argumento, la nomo de la dokumento ni volas krei. En ĉi tiu kazo, ni nomas ĝin doc.txt. Ni kuras la programo kaj enmeti kelkaj linioj. Saluton. Mia nomo estas Jason. Fine, ni tajpi "quit". Se ni nun listigi ĉiujn dosierojn en tiu ĉi dosierujo, ni vidas, ke nova dokumento ekzistas nomita doc.txt. Tio estas la dosiero ĉi programo ĵus kreita. Kaj kompreneble, ĝi ankaŭ estas nenio pli ol longa vico de nuloj kaj aĵoj. Se ni malfermos tiu nova dosiero, ni vidas la 3 linioj de kodo ni eniris en nia programo - Saluton. Majo nomo estas Jason. Sed kio fakte okazas kiam typewriter.c kuras? La unua linio de intereso por ni estas linio 24. En ĉi tiu linio, ni deklaras nian dosieron puntero. La funkcio kiu liveras tiun pointer, fopen, prenas du argumentojn. La unua estas la dosiernomo inkludante la dosiersufikso se taŭgaj. Memori, ke sufikso ne influas la dosieron ĉe ĝia plej malalta nivelo. Ni ĉiam kontraktanta kun longa vico de nuloj kaj aĵoj. Sed ĝi faras influon kiel dosieroj estas interpretitaj kaj kion aplikoj uzas por malfermi ilin. La dua argumento al fopen estas sola litero kiu elstaras por kio ni planas fari post ni malfermu la dosieron. Estas tri ebloj por tiu argumento - W, R, kaj A. Ni elektis w en ĉi tiu kazo ĉar ni volas skribi al la dosiero. R, kiel vi povas diveni probable, estas por legi la dosieron. Kaj estas por appending al la dosiero. Dum ambaŭ w kaj povas esti uzita por skribi al dosieroj, w komencos skribi de la komenco de la dosiero kaj potenciale anstatauxigas ajna datumoj kiuj antaŭe estis stokita. Defaŭlte, la arkivo ni malfermos, se ĝi ne jam ekzistas, estas kreita en nia aktuala laborante dosierujo. Tamen, se ni volas havi aliron aŭ krei dosieron en malsama loko, en la unua argumento de fopen, ni povas specifi dosieron vojo krom la dosiernomo. Dum la unua parto de ĉi tiu procezo estas nur unu linion de kodo longa, ĝi estas ĉiam bona praktiko por inkludi alia aro de linioj ke kontroli por certiĝi ke la dosiero estis sukcese malfermita aŭ kreita. Se fopen revenas nula, ni ne volas forĝi antaŭeniras kun nia programo, kaj tio povas okazi se la mastruma sistemo estas el memoro aŭ se ni provas malfermi dosieron en dosierujo por kiu ni ne havis la ĝustan permesojn. Parto du de la procezo okazas en tajpilo la dum ciklo. Ni uzas CS50 biblioteko funkcio por ricevi enigo de la uzanto, kaj supozante ke ili ne volas lasi la programon, ni uzu la funkcion fputs preni la ŝnuron kaj skribi ĝin al la dosiero. fputs estas nur unu el la multaj funkcioj ni povus uzi por skribi al la dosiero. Aliaj inkludas fwrite, fputc, kaj eĉ fprintf. Sendepende de la aparta funkcio ni fini uzante, tamen, ĉiuj ili bezonas scii, tra iliaj argumentoj, almenaŭ du aferoj - kio devas esti skribita kaj kie devas esti skribitaj al. En nia kazo, enigo estas la ĉeno kiu bezonas esti skribita kaj fp estas la puntero kiu direktas nin al kie ni skribante. En ĉi tiu programo, parto du de la procezo estas iom simpla. Ni simple prenante ĉenon de la uzanto kaj aldonante ĝin rekte al nia arkivo kun iom-al-ne enigo validación aŭ sekureco kontroloj. Ofte, tamen, parto du estos levu la dika de via kodo. Fine, parto tri estas ĉe linio 58, kie ni fermas la dosiero. Jen ni nomas fclose kaj fordoni nian originalan dosieron puntero. En la posta linio, ni revenas nulo, markante la fino de nia programo. Kaj, jes, parto tri estas tiel simpla kiel tiu. Ni movi antaŭen al legado de dosieroj. Reen en nia katalogo ni havas dosieron nomatan printer.c. Ni kuras ĝin kun la arkivo ni ĵus kreita - doc.txt. Ĉi tiu programo, kiel la nomo sugestas, ĝi simple presi la enhavon de la dosiero pasis al ĝi. Kaj tie ni havas ĝin. La linioj de kodo ni tajpis antaŭe kaj savis en doc.txt. Saluton. Mia nomo estas Jason. Se ni pikita en printer.c, ni vidas ke multo de la kodo aspektas simila al tio, kion ni ĵus piediris tra en typewriter.c. Ja linio 22, kie ni malfermis la dosieron, kaj linio 39, kie ni fermis la dosiero, ambaŭ estas preskaŭ identa al typewriter.c, krom fopen dua argumento. Ĉi-foje ni legas de dosiero, tial ni elektis r anstataŭ w. Tiel, ni koncentriĝas pri la dua parto de la procezo. En linio 35, kiel la dua kondiĉo en nia 4 buklo, ni faras alvokon al fgets, la kompano funkcio fputs de antaŭ. Ĉi-foje ni havas tri argumentojn. La unua estas la sagon al la tabelo de signoj kie la ŝnuro estos stokitaj. La dua estas la maksimuma nombro da signoj por legi. Kaj la tria estas la sagon al la dosiero kun kiu ni laboras. Vi rimarkos ke la por buklo finas kiam fgets revenas nula. Estas du kialo ke ĉi tio povas esti okazinta. Unue, eraro eble okazis. Due, kaj pli verŝajna, la fino de la dosiero estis atingita kaj ne plu karakteroj estis legita. En kazo vi demandante, du funkcioj ja ekzistas kiu nin permesas diri kiu kialo estas la kaŭzo por ĉi tiu aparta nula puntero. Kaj, ne surprize, ĉar ili devas fari kun labori kun dosieroj, ambaŭ la ferror funkcio kaj la funkcio feof komenco kun la litero f. Fine, antaŭ ol ni konkludi, unu rapida noto pri la fino de dosiero funkcio, kiu, kiel ĵus menciis, estas skribita kiel feof. Ofte vi trovos vin uzanta momenton kaj por bukloj al progresive legi vian vojon tra dosierojn. Tiel, vi bezonos maniero por fini tiujn maŝojn post vi atingas la finon de ĉi tiuj dosieroj. Nomante feof en via dosiero puntero kaj kontrolado por vidi se ĝi estas vera farus nur tion. Tiel, dum tempo buklo kun la kondiĉo (! Feof (fp)) povus aspekti kiel perfekte taŭga solvo. Tamen, ke ni havas unu linion lasis en nia teksta dosiero. Ni eniros nian agadon loop kaj ĉio estos ellabori kiel planita. En la sekvan rondon tra, nia programo kontrolos por vidi se feof de fp estas vera, sed - kaj tio estas la krita punkto por kompreni ĉi tie - ne estos vera nur ankoraŭ. Tio estas ĉar la celo de feof ne por kontroli se la venonta alvoko al legis funkcio estos batis la fino de la dosiero, sed prefere por kontroli ĉu la fino de la dosiero estas jam atingita. En la kazo de ĉi tiu ekzemplo, legante la lasta linio de nia dosiero iras perfekte glate, sed la programo ankoraŭ ne scias, ke ni batis la fino de nia dosiero. Ne ĝis faras unu plian legu ke counters la fino de la dosiero. Tiel, ĝentila kondiĉo estus la sekvaj: fgets kaj liaj tri argumentojn - eligo, grandeco de produktado, kaj fp - kaj ĉiuj kiuj ne egala al nula. Ĉi tiu estas la alproksimiĝo ni prenis en printer.c, kaj en ĉi tiu kazo, post la buklo eliroj, vi povus voki feof aŭ ferror informi la uzanto kiel al la specifa rezonado por eliri tiun banton. Skribi al kaj legado de dosiero estas, lia plej baza, simpla 3-parto procezo. Unue, ni malfermu la dosieron. Due, ni metis kelkajn aferojn en nian dosieron aŭ preni kelkajn aferojn el ĝi. Trie, ni fermas la dosiero. La unua kaj lasta lokoj estas facila. La meza parto estas kie la malfacilaj aĵoj mensogas. Kaj kvankam sub la kapuĉo ni ĉiam kontraktanta kun longa vico de nuloj kaj, ĝi helpas kiam kodigo aldoni mantelo de abstraktado kiu igas la vico en iu kiu pli proksime similas kion ni uzis por vidi. Ekzemple, se ni laboras kun 24-bitan bitmap dosiero, ni verŝajne povas legi aŭ skribi tri bitokoj samtempe. En tiu kazo, estus sensencaĵo por difini kaj taŭge enoficigi a struct ke estas 3 bajtoj granda. Kvankam laborante kun dosieroj povas simili komplikita, uzante ilin permesas ni al fari ion vere rimarkinda. Ni povas ŝanĝi la staton de la mondo ekster nia programo, ni povas krei iun kiu vivas tie de la vivo de nia programo, aŭ ni povas eĉ ŝanĝi ion kiu estis kreita antaux nia programo komencis kuri. Interagante kun dosieroj estas vere potenca parto de programado en C. kaj mi entuziasmigis por vidi kion vi tuj krei per ĝi en la kodo de konduto. Mia nomo estas Jason Hirschhorn. Ĉi tiu estas CS50. [CS50.TV] [Ridado] Okay. Unu preni. Ĉi tie ni iru. Kiam ni pensas pri dosiero - >> Ho, atendu. Pardonu. [Ridado] Okay. Hej tie. Kiam ni pensas pri dosiero - Kiam vi pensas de dosiero - Okay. Diru al mi kiam vi estas preta. Ho, granda. Kvankam legado de teleprompter povas ŝajni - ne. Mia malbona.