1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Dosiera / S] 2 00:00:02,000 --> 00:00:04,000 [Jason Hirschhorn, Harvard University] 3 00:00:04,000 --> 00:00:07,000 [Jen CS50, CS50.TV] 4 00:00:07,000 --> 00:00:11,000 Kiam ni pensas pri iu dosiero, kio venas al la menso estas Microsoft Word dokumento, 5 00:00:11,000 --> 00:00:14,000 a JPEG bildo, aŭ MP3 kanto, 6 00:00:14,000 --> 00:00:17,000 kaj ni interagas kun ĉiu de ĉi tiuj tipoj de dosieroj en malsamaj manieroj. 7 00:00:17,000 --> 00:00:20,000 Ekzemple, en Word dokumento ni aldonu teksto 8 00:00:20,000 --> 00:00:24,000 dum kun JPEG bildo ni povus okazi ekster la eĝoj aŭ retouch la koloroj. 9 00:00:24,000 --> 00:00:28,000 Sed sub la kapuĉo ĉiujn dosierojn en nia komputilo ne estas pli 10 00:00:28,000 --> 00:00:31,000 ol longa vico de nuloj kaj aĵoj. 11 00:00:31,000 --> 00:00:33,000 Ĝi dependas de la specifa apliko kiu interagas kun la dosiero 12 00:00:33,000 --> 00:00:38,000 decidi kiel procesi tiu longa vico kaj prezenti ĝin al la uzanto. 13 00:00:38,000 --> 00:00:41,000 Unuflanke, dokumento povas rigardi nur unu bajto, 14 00:00:41,000 --> 00:00:45,000 aŭ 8 nuloj kaj, kaj montri ASCII signo sur la ekrano. 15 00:00:45,000 --> 00:00:48,000 Aliflanke, oni bitmap image povas rigardi 3 bajtoj, 16 00:00:48,000 --> 00:00:50,000 aŭ 24 nuloj kaj, 17 00:00:50,000 --> 00:00:53,000 kaj interpreti ilin kiel 3 deksesuma nombro 18 00:00:53,000 --> 00:00:56,000 kiuj reprezentas la valoroj por ruĝa, verda, kaj blua 19 00:00:56,000 --> 00:00:58,000 en unu bildero de bildo. 20 00:00:58,000 --> 00:01:01,000 Kion ili povas aspekti en via ekrano, en ilia kerno, 21 00:01:01,000 --> 00:01:05,000 dosieroj estas nenio pli ol vico de nuloj kaj aĵoj. 22 00:01:05,000 --> 00:01:08,000 Do estu la plonĝi en kaj rigardi kiom ni efektive manipulas tiujn nuloj kaj 23 00:01:08,000 --> 00:01:12,000 kiam temas pri skribo por kaj legante de dosiero. 24 00:01:12,000 --> 00:01:15,000 >> Mi komencos per rompanta ĝi malsupren en simpla 3-parto procezo. 25 00:01:15,000 --> 00:01:19,000 Tuj poste, mi plonĝi en du kodo ekzemploj kiuj pruvas tiuj tri partoj. 26 00:01:19,000 --> 00:01:23,000 Fine, mi revizios la procezo kaj kelkaj el liaj plej gravaj detaloj. 27 00:01:23,000 --> 00:01:25,000 Kiel kun ajna dosiero, kiu sidas sur via labortablo, 28 00:01:25,000 --> 00:01:28,000 la unua afero por fari estas malfermi ĝin. 29 00:01:28,000 --> 00:01:31,000 En C ni faros ĉi deklarante puntero al predefinido struct 30 00:01:31,000 --> 00:01:33,000 kiu reprezentas dosieron sur diskon. 31 00:01:33,000 --> 00:01:38,460 En tiu funkcio alvoko, ni ankaŭ decidi ĉu ni volas skribi al aŭ legas de la dosiero. 32 00:01:38,460 --> 00:01:41,660 Poste, ni faru la realan legado kaj skribado. 33 00:01:41,660 --> 00:01:44,800 Ekzistas kelkaj specialigitaj funkcioj povas uzi en ĉi parto, 34 00:01:44,800 --> 00:01:48,790 kaj preskaŭ ĉiuj el ili komencas per la litero C, kiu staras por dosiero. 35 00:01:48,790 --> 00:01:53,560 Lasta, simila al la malgranda ruĝa X en la supro angulo de la dosieroj malfermi en via komputilo, 36 00:01:53,560 --> 00:01:56,680 ni fermas la dosieron kun fina funkcio nomita. 37 00:01:56,680 --> 00:01:59,540 Nun ke ni havas ĝeneralan ideon de tio, kion ni faros, 38 00:01:59,540 --> 00:02:02,000 ni pikita en la kodo. 39 00:02:02,000 --> 00:02:06,100 >> En ĉi tiu dosierujo, ni havas du C dosieroj kaj iliaj respondaj ruleblan dosierojn. 40 00:02:06,100 --> 00:02:09,710 La tajpilo programo prenas unu komandlinio argumento, 41 00:02:09,710 --> 00:02:12,060 la nomo de la dokumento ni volas krei. 42 00:02:12,060 --> 00:02:16,160 En ĉi tiu kazo, ni nomas ĝin doc.txt. 43 00:02:16,160 --> 00:02:19,080 Ni kuras la programo kaj enmeti kelkaj linioj. 44 00:02:19,080 --> 00:02:23,660 Saluton. Mia nomo estas Jason. 45 00:02:23,660 --> 00:02:26,710 Fine, ni tajpi "quit". 46 00:02:26,710 --> 00:02:29,720 Se ni nun listigi ĉiujn dosierojn en tiu ĉi dosierujo, 47 00:02:29,720 --> 00:02:33,770 ni vidas, ke nova dokumento ekzistas nomita doc.txt. 48 00:02:34,190 --> 00:02:36,110 Tio estas la dosiero ĉi programo ĵus kreita. 49 00:02:36,110 --> 00:02:40,520 Kaj kompreneble, ĝi ankaŭ estas nenio pli ol longa vico de nuloj kaj aĵoj. 50 00:02:41,100 --> 00:02:43,260 Se ni malfermos tiu nova dosiero, 51 00:02:43,260 --> 00:02:45,870 ni vidas la 3 linioj de kodo ni eniris en nia programo - 52 00:02:46,060 --> 00:02:49,060 Saluton. Majo nomo estas Jason. 53 00:02:49,580 --> 00:02:52,090 Sed kio fakte okazas kiam typewriter.c kuras? 54 00:02:52,810 --> 00:02:55,520 La unua linio de intereso por ni estas linio 24. 55 00:02:55,560 --> 00:02:58,490 En ĉi tiu linio, ni deklaras nian dosieron puntero. 56 00:02:59,080 --> 00:03:03,140 La funkcio kiu liveras tiun pointer, fopen, prenas du argumentojn. 57 00:03:03,140 --> 00:03:07,440 La unua estas la dosiernomo inkludante la dosiersufikso se taŭgaj. 58 00:03:07,440 --> 00:03:10,980 Memori, ke sufikso ne influas la dosieron ĉe ĝia plej malalta nivelo. 59 00:03:10,980 --> 00:03:14,640 Ni ĉiam kontraktanta kun longa vico de nuloj kaj aĵoj. 60 00:03:14,640 --> 00:03:19,630 Sed ĝi faras influon kiel dosieroj estas interpretitaj kaj kion aplikoj uzas por malfermi ilin. 61 00:03:19,630 --> 00:03:22,290 La dua argumento al fopen estas sola litero 62 00:03:22,290 --> 00:03:25,300 kiu elstaras por kio ni planas fari post ni malfermu la dosieron. 63 00:03:25,300 --> 00:03:30,630 Estas tri ebloj por tiu argumento - W, R, kaj A. 64 00:03:30,630 --> 00:03:34,900 Ni elektis w en ĉi tiu kazo ĉar ni volas skribi al la dosiero. 65 00:03:34,900 --> 00:03:38,820 R, kiel vi povas diveni probable, estas por legi la dosieron. 66 00:03:38,820 --> 00:03:41,760 Kaj estas por appending al la dosiero. 67 00:03:41,760 --> 00:03:44,960 Dum ambaŭ w kaj povas esti uzita por skribi al dosieroj, 68 00:03:44,960 --> 00:03:47,460 w komencos skribi de la komenco de la dosiero 69 00:03:47,460 --> 00:03:50,810 kaj potenciale anstatauxigas ajna datumoj kiuj antaŭe estis stokita. 70 00:03:50,810 --> 00:03:54,070 Defaŭlte, la arkivo ni malfermos, se ĝi ne jam ekzistas, 71 00:03:54,070 --> 00:03:57,180 estas kreita en nia aktuala laborante dosierujo. 72 00:03:57,180 --> 00:04:00,540 Tamen, se ni volas havi aliron aŭ krei dosieron en malsama loko, 73 00:04:00,540 --> 00:04:02,650 en la unua argumento de fopen, 74 00:04:02,650 --> 00:04:05,840 ni povas specifi dosieron vojo krom la dosiernomo. 75 00:04:05,840 --> 00:04:09,490 Dum la unua parto de ĉi tiu procezo estas nur unu linion de kodo longa, 76 00:04:09,490 --> 00:04:12,350 ĝi estas ĉiam bona praktiko por inkludi alia aro de linioj 77 00:04:12,350 --> 00:04:15,930 ke kontroli por certiĝi ke la dosiero estis sukcese malfermita aŭ kreita. 78 00:04:15,930 --> 00:04:20,300 Se fopen revenas nula, ni ne volas forĝi antaŭeniras kun nia programo, 79 00:04:20,300 --> 00:04:23,270 kaj tio povas okazi se la mastruma sistemo estas el memoro 80 00:04:23,270 --> 00:04:27,940 aŭ se ni provas malfermi dosieron en dosierujo por kiu ni ne havis la ĝustan permesojn. 81 00:04:27,940 --> 00:04:31,780 >> Parto du de la procezo okazas en tajpilo la dum ciklo. 82 00:04:31,780 --> 00:04:35,000 Ni uzas CS50 biblioteko funkcio por ricevi enigo de la uzanto, 83 00:04:35,000 --> 00:04:37,190 kaj supozante ke ili ne volas lasi la programon, 84 00:04:37,190 --> 00:04:41,940 ni uzu la funkcion fputs preni la ŝnuron kaj skribi ĝin al la dosiero. 85 00:04:41,940 --> 00:04:46,700 fputs estas nur unu el la multaj funkcioj ni povus uzi por skribi al la dosiero. 86 00:04:46,700 --> 00:04:51,920 Aliaj inkludas fwrite, fputc, kaj eĉ fprintf. 87 00:04:51,920 --> 00:04:54,840 Sendepende de la aparta funkcio ni fini uzante, tamen, 88 00:04:54,840 --> 00:04:57,480 ĉiuj ili bezonas scii, tra iliaj argumentoj, 89 00:04:57,480 --> 00:04:59,670 almenaŭ du aferoj - 90 00:04:59,670 --> 00:05:03,140 kio devas esti skribita kaj kie devas esti skribitaj al. 91 00:05:03,140 --> 00:05:07,240 En nia kazo, enigo estas la ĉeno kiu bezonas esti skribita 92 00:05:07,240 --> 00:05:11,290 kaj fp estas la puntero kiu direktas nin al kie ni skribante. 93 00:05:11,290 --> 00:05:15,330 En ĉi tiu programo, parto du de la procezo estas iom simpla. 94 00:05:15,330 --> 00:05:17,360 Ni simple prenante ĉenon de la uzanto 95 00:05:17,360 --> 00:05:22,120 kaj aldonante ĝin rekte al nia arkivo kun iom-al-ne enigo validación aŭ sekureco kontroloj. 96 00:05:22,120 --> 00:05:26,160 Ofte, tamen, parto du estos levu la dika de via kodo. 97 00:05:26,160 --> 00:05:30,580 Fine, parto tri estas ĉe linio 58, kie ni fermas la dosiero. 98 00:05:30,580 --> 00:05:34,860 Jen ni nomas fclose kaj fordoni nian originalan dosieron puntero. 99 00:05:34,860 --> 00:05:39,500 En la posta linio, ni revenas nulo, markante la fino de nia programo. 100 00:05:39,500 --> 00:05:42,630 Kaj, jes, parto tri estas tiel simpla kiel tiu. 101 00:05:42,630 --> 00:05:45,260 >> Ni movi antaŭen al legado de dosieroj. 102 00:05:45,260 --> 00:05:48,220 Reen en nia katalogo ni havas dosieron nomatan printer.c. 103 00:05:48,220 --> 00:05:50,910 Ni kuras ĝin kun la arkivo ni ĵus kreita - 104 00:05:50,910 --> 00:05:53,350 doc.txt. 105 00:05:53,350 --> 00:05:58,150 Ĉi tiu programo, kiel la nomo sugestas, ĝi simple presi la enhavon de la dosiero pasis al ĝi. 106 00:05:58,150 --> 00:06:00,230 Kaj tie ni havas ĝin. 107 00:06:00,230 --> 00:06:03,780 La linioj de kodo ni tajpis antaŭe kaj savis en doc.txt. 108 00:06:03,780 --> 00:06:06,980 Saluton. Mia nomo estas Jason. 109 00:06:06,980 --> 00:06:09,120 Se ni pikita en printer.c, 110 00:06:09,120 --> 00:06:13,570 ni vidas ke multo de la kodo aspektas simila al tio, kion ni ĵus piediris tra en typewriter.c. 111 00:06:13,570 --> 00:06:16,720 Ja linio 22, kie ni malfermis la dosieron, 112 00:06:16,720 --> 00:06:19,220 kaj linio 39, kie ni fermis la dosiero, 113 00:06:19,220 --> 00:06:23,890 ambaŭ estas preskaŭ identa al typewriter.c, krom fopen dua argumento. 114 00:06:23,890 --> 00:06:26,510 Ĉi-foje ni legas de dosiero, 115 00:06:26,510 --> 00:06:29,040 tial ni elektis r anstataŭ w. 116 00:06:29,040 --> 00:06:31,950 Tiel, ni koncentriĝas pri la dua parto de la procezo. 117 00:06:31,950 --> 00:06:36,060 En linio 35, kiel la dua kondiĉo en nia 4 buklo, 118 00:06:36,060 --> 00:06:38,590 ni faras alvokon al fgets, 119 00:06:38,590 --> 00:06:42,190 la kompano funkcio fputs de antaŭ. 120 00:06:42,190 --> 00:06:44,660 Ĉi-foje ni havas tri argumentojn. 121 00:06:44,660 --> 00:06:48,810 La unua estas la sagon al la tabelo de signoj kie la ŝnuro estos stokitaj. 122 00:06:48,810 --> 00:06:52,670 La dua estas la maksimuma nombro da signoj por legi. 123 00:06:52,670 --> 00:06:56,010 Kaj la tria estas la sagon al la dosiero kun kiu ni laboras. 124 00:06:56,010 --> 00:07:00,780 Vi rimarkos ke la por buklo finas kiam fgets revenas nula. 125 00:07:00,780 --> 00:07:02,940 Estas du kialo ke ĉi tio povas esti okazinta. 126 00:07:02,940 --> 00:07:05,380 Unue, eraro eble okazis. 127 00:07:05,380 --> 00:07:10,740 Due, kaj pli verŝajna, la fino de la dosiero estis atingita kaj ne plu karakteroj estis legita. 128 00:07:10,740 --> 00:07:14,040 En kazo vi demandante, du funkcioj ja ekzistas kiu nin permesas diri 129 00:07:14,040 --> 00:07:17,160 kiu kialo estas la kaŭzo por ĉi tiu aparta nula puntero. 130 00:07:17,160 --> 00:07:21,090 Kaj, ne surprize, ĉar ili devas fari kun labori kun dosieroj, 131 00:07:21,090 --> 00:07:26,940 ambaŭ la ferror funkcio kaj la funkcio feof komenco kun la litero f. 132 00:07:26,940 --> 00:07:32,130 >> Fine, antaŭ ol ni konkludi, unu rapida noto pri la fino de dosiero funkcio, 133 00:07:32,130 --> 00:07:36,690 kiu, kiel ĵus menciis, estas skribita kiel feof. 134 00:07:36,690 --> 00:07:41,550 Ofte vi trovos vin uzanta momenton kaj por bukloj al progresive legi vian vojon tra dosierojn. 135 00:07:41,550 --> 00:07:45,790 Tiel, vi bezonos maniero por fini tiujn maŝojn post vi atingas la finon de ĉi tiuj dosieroj. 136 00:07:45,790 --> 00:07:50,510 Nomante feof en via dosiero puntero kaj kontrolado por vidi se ĝi estas vera 137 00:07:50,510 --> 00:07:52,310 farus nur tion. 138 00:07:52,310 --> 00:07:59,820 Tiel, dum tempo buklo kun la kondiĉo (! Feof (fp)) povus aspekti kiel perfekte taŭga solvo. 139 00:07:59,820 --> 00:08:03,770 Tamen, ke ni havas unu linion lasis en nia teksta dosiero. 140 00:08:03,770 --> 00:08:07,130 Ni eniros nian agadon loop kaj ĉio estos ellabori kiel planita. 141 00:08:07,130 --> 00:08:12,750 En la sekvan rondon tra, nia programo kontrolos por vidi se feof de fp estas vera, 142 00:08:12,750 --> 00:08:15,430 sed - kaj tio estas la krita punkto por kompreni ĉi tie - 143 00:08:15,430 --> 00:08:17,770 ne estos vera nur ankoraŭ. 144 00:08:17,770 --> 00:08:21,110 Tio estas ĉar la celo de feof ne por kontroli 145 00:08:21,110 --> 00:08:24,400 se la venonta alvoko al legis funkcio estos batis la fino de la dosiero, 146 00:08:24,400 --> 00:08:28,190 sed prefere por kontroli ĉu la fino de la dosiero estas jam atingita. 147 00:08:28,190 --> 00:08:30,140 En la kazo de ĉi tiu ekzemplo, 148 00:08:30,140 --> 00:08:32,780 legante la lasta linio de nia dosiero iras perfekte glate, 149 00:08:32,780 --> 00:08:36,210 sed la programo ankoraŭ ne scias, ke ni batis la fino de nia dosiero. 150 00:08:36,210 --> 00:08:40,549 Ne ĝis faras unu plian legu ke counters la fino de la dosiero. 151 00:08:40,549 --> 00:08:43,210 Tiel, ĝentila kondiĉo estus la sekvaj: 152 00:08:43,210 --> 00:08:49,330 fgets kaj liaj tri argumentojn - eligo, grandeco de produktado, kaj fp - 153 00:08:49,330 --> 00:08:52,570 kaj ĉiuj kiuj ne egala al nula. 154 00:08:52,570 --> 00:08:55,260 Ĉi tiu estas la alproksimiĝo ni prenis en printer.c, 155 00:08:55,260 --> 00:08:57,890 kaj en ĉi tiu kazo, post la buklo eliroj, 156 00:08:57,890 --> 00:09:04,290 vi povus voki feof aŭ ferror informi la uzanto kiel al la specifa rezonado por eliri tiun banton. 157 00:09:04,290 --> 00:09:08,100 >> Skribi al kaj legado de dosiero estas, lia plej baza, 158 00:09:08,100 --> 00:09:10,150 simpla 3-parto procezo. 159 00:09:10,150 --> 00:09:12,530 Unue, ni malfermu la dosieron. 160 00:09:12,530 --> 00:09:16,740 Due, ni metis kelkajn aferojn en nian dosieron aŭ preni kelkajn aferojn el ĝi. 161 00:09:16,740 --> 00:09:19,200 Trie, ni fermas la dosiero. 162 00:09:19,200 --> 00:09:21,170 La unua kaj lasta lokoj estas facila. 163 00:09:21,170 --> 00:09:23,920 La meza parto estas kie la malfacilaj aĵoj mensogas. 164 00:09:23,920 --> 00:09:27,760 Kaj kvankam sub la kapuĉo ni ĉiam kontraktanta kun longa vico de nuloj kaj, 165 00:09:27,760 --> 00:09:30,710 ĝi helpas kiam kodigo aldoni mantelo de abstraktado 166 00:09:30,710 --> 00:09:35,350 kiu igas la vico en iu kiu pli proksime similas kion ni uzis por vidi. 167 00:09:35,350 --> 00:09:39,570 Ekzemple, se ni laboras kun 24-bitan bitmap dosiero, 168 00:09:39,570 --> 00:09:43,290 ni verŝajne povas legi aŭ skribi tri bitokoj samtempe. 169 00:09:43,290 --> 00:09:46,450 En tiu kazo, estus sensencaĵo por difini kaj taŭge enoficigi 170 00:09:46,450 --> 00:09:48,980 a struct ke estas 3 bajtoj granda. 171 00:09:48,980 --> 00:09:51,410 >> Kvankam laborante kun dosieroj povas simili komplikita, 172 00:09:51,410 --> 00:09:54,530 uzante ilin permesas ni al fari ion vere rimarkinda. 173 00:09:54,530 --> 00:09:58,880 Ni povas ŝanĝi la staton de la mondo ekster nia programo, 174 00:09:58,880 --> 00:10:01,730 ni povas krei iun kiu vivas tie de la vivo de nia programo, 175 00:10:01,730 --> 00:10:07,190 aŭ ni povas eĉ ŝanĝi ion kiu estis kreita antaux nia programo komencis kuri. 176 00:10:07,190 --> 00:10:11,210 Interagante kun dosieroj estas vere potenca parto de programado en C. 177 00:10:11,210 --> 00:10:15,300 kaj mi entuziasmigis por vidi kion vi tuj krei per ĝi en la kodo de konduto. 178 00:10:15,300 --> 00:10:19,770 Mia nomo estas Jason Hirschhorn. Ĉi tiu estas CS50. 179 00:10:19,770 --> 00:10:21,770 [CS50.TV] 180 00:10:21,770 --> 00:10:25,940 >> [Ridado] 181 00:10:25,940 --> 00:10:29,330 Okay. Unu preni. Ĉi tie ni iru. 182 00:10:49,000 --> 00:10:52,140 Kiam ni pensas pri dosiero - >> Ho, atendu. Pardonu. 183 00:10:52,140 --> 00:10:56,800 [Ridado] Okay. 184 00:11:06,620 --> 00:11:09,970 Hej tie. 185 00:11:13,670 --> 00:11:16,310 Kiam ni pensas pri dosiero - 186 00:11:17,610 --> 00:11:20,710 Kiam vi pensas de dosiero - Okay. Diru al mi kiam vi estas preta. 187 00:11:20,710 --> 00:11:22,520 Ho, granda. 188 00:11:22,520 --> 00:11:26,180 Kvankam legado de teleprompter povas ŝajni - ne. Mia malbona.