1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Филе И / О] 2 00:00:02,000 --> 00:00:04,000 [Џејсон Хирсцххорн, Универзитет Харвард] 3 00:00:04,000 --> 00:00:07,000 [Ово је ЦС50, ЦС50.ТВ] 4 00:00:07,000 --> 00:00:11,000 Када мислимо о фајлу, што нам пада на памет је Мицрософт Ворд документ, 5 00:00:11,000 --> 00:00:14,000 ЈПЕГ слика, или МП3 сонг, 6 00:00:14,000 --> 00:00:17,000 и ми смо у интеракцији са сваком од ових типова фајлова у различите начине. 7 00:00:17,000 --> 00:00:20,000 На пример, у Ворд документ додамо текст 8 00:00:20,000 --> 00:00:24,000 док је са ЈПЕГ сликом можемо изрезати од ивице или ретуширање боје. 9 00:00:24,000 --> 00:00:28,000 Ипак, под хаубом све фајлове у нашем рачунару ништа више 10 00:00:28,000 --> 00:00:31,000 од дугог низа нула и јединица. 11 00:00:31,000 --> 00:00:33,000 То је до специфичне апликације која у интеракцији са датотеком 12 00:00:33,000 --> 00:00:38,000 да одлучи како да обрадимо ту дугу секвенцу и представити га кориснику. 13 00:00:38,000 --> 00:00:41,000 С једне стране, документ може погледати само једном бајту, 14 00:00:41,000 --> 00:00:45,000 или 8 нуле и јединице, као и приказивање АСЦИИ карактер на екрану. 15 00:00:45,000 --> 00:00:48,000 С друге стране, растерска слика може погледати на 3 бајта, 16 00:00:48,000 --> 00:00:50,000 или 24 нуле и јединице, 17 00:00:50,000 --> 00:00:53,000 и тумаче их као хексадецималне бројеве 3 18 00:00:53,000 --> 00:00:56,000 који представљају вредности за црвену, зелену и плаву 19 00:00:56,000 --> 00:00:58,000 у један пиксел слике. 20 00:00:58,000 --> 00:01:01,000 Шта год могу изгледати на екрану, у самом језгру, 21 00:01:01,000 --> 00:01:05,000 фајлови нису ништа више него низ нула и јединица. 22 00:01:05,000 --> 00:01:08,000 Дакле, хајде да зароните у и погледајте како заправо манипулишу овим нуле и јединице 23 00:01:08,000 --> 00:01:12,000 када је у питању писање и читање из датотеке. 24 00:01:12,000 --> 00:01:15,000 >> Ја ћу почети тако да се разбије на једноставан 3-дио процеса. 25 00:01:15,000 --> 00:01:19,000 Даље, ја ћу зароне у два кода примера који показују ове три дела. 26 00:01:19,000 --> 00:01:23,000 Коначно, ја ћу прегледати процес и неке од његових најважнијих детаља. 27 00:01:23,000 --> 00:01:25,000 Као и код било ког фајла који седи на радној површини, 28 00:01:25,000 --> 00:01:28,000 прва ствар коју треба да урадите је да га отвори. 29 00:01:28,000 --> 00:01:31,000 У Ц радимо ово проглашење показивач на предефинисаним струцт 30 00:01:31,000 --> 00:01:33,000 која представља датотеку на диску. 31 00:01:33,000 --> 00:01:38,460 У овом позива функције, такође одлучити да ли желимо да пише или чита из датотеке. 32 00:01:38,460 --> 00:01:41,660 Даље, ми стварно читања и писања. 33 00:01:41,660 --> 00:01:44,800 Постоји низ специјализованих функција можемо користити у овом делу, 34 00:01:44,800 --> 00:01:48,790 и скоро сви почињу са словом Ф, која се залаже за датотеку. 35 00:01:48,790 --> 00:01:53,560 Последњи, сличан малим црвеним Кс у горњем углу датотека отворена на рачунару, 36 00:01:53,560 --> 00:01:56,680 ми смо затворили датотеку са завршном позива функције. 37 00:01:56,680 --> 00:01:59,540 Сада када имамо општу идеју о томе шта ћемо да урадимо, 38 00:01:59,540 --> 00:02:02,000 хајдемо зароните у коду. 39 00:02:02,000 --> 00:02:06,100 >> У овом регистру, имамо две Ц фајлова и њихове одговарајуће извршне датотеке. 40 00:02:06,100 --> 00:02:09,710 Писаћој машини Програм траје један аргумент командне линије, 41 00:02:09,710 --> 00:02:12,060 назив документа желимо да стварамо. 42 00:02:12,060 --> 00:02:16,160 У овом случају, ми ћемо га зову доц.ткт. 43 00:02:16,160 --> 00:02:19,080 Хајде покрените програм и унесите неколико линија. 44 00:02:19,080 --> 00:02:23,660 Здраво. Моје име је Џејсон. 45 00:02:23,660 --> 00:02:26,710 Коначно, ми ћемо упишите "куит". 46 00:02:26,710 --> 00:02:29,720 Ако сада списак свих датотека у том именику, 47 00:02:29,720 --> 00:02:33,770 видимо да нови документ постоји зове доц.ткт. 48 00:02:34,190 --> 00:02:36,110 То је фајл овај програм управо креирали. 49 00:02:36,110 --> 00:02:40,520 И наравно, и она није ништа више него дугог низа нула и јединица. 50 00:02:41,100 --> 00:02:43,260 Ако смо отворили овај нови фајл, 51 00:02:43,260 --> 00:02:45,870 видимо 3 линије кода смо ушли у наш програм - 52 00:02:46,060 --> 00:02:49,060 Здраво. Мај име је Џејсон. 53 00:02:49,580 --> 00:02:52,090 Али шта се заправо дешава када типевритер.ц ради? 54 00:02:52,810 --> 00:02:55,520 Прва линија од интереса за нас је линија 24. 55 00:02:55,560 --> 00:02:58,490 У овој линији, ми изјављујемо нашу показивач датотеке. 56 00:02:59,080 --> 00:03:03,140 Функција која враћа овај показивач, фопен, узима два аргумента. 57 00:03:03,140 --> 00:03:07,440 Први је име датотеке, укључујући датотеке екстензију ако је потребно. 58 00:03:07,440 --> 00:03:10,980 Подсетимо се да екстензија не утиче на фајл на свом најнижем нивоу. 59 00:03:10,980 --> 00:03:14,640 Ми увек имамо посла са дугом низу нула и јединица. 60 00:03:14,640 --> 00:03:19,630 Али то утиче како су датотеке тумачити и које апликације користе за њихово отварање. 61 00:03:19,630 --> 00:03:22,290 Други аргумент фопен је једно слово 62 00:03:22,290 --> 00:03:25,300 која се залаже за оно што планирамо да урадимо када смо отворили датотеку. 63 00:03:25,300 --> 00:03:30,630 Постоје три опције за овај аргумент - В, Р и А. 64 00:03:30,630 --> 00:03:34,900 Одабрали смо ж у овом случају, јер желимо да пишем у датотеку. 65 00:03:34,900 --> 00:03:38,820 Р, као што вероватно можете погодити, је за читање датотеке. 66 00:03:38,820 --> 00:03:41,760 А је за додавање датотеке. 67 00:03:41,760 --> 00:03:44,960 Иако су обе В и може да се користи за писање у фајлове, 68 00:03:44,960 --> 00:03:47,460 в ће почети писање од почетка фајла 69 00:03:47,460 --> 00:03:50,810 и потенцијално преписати све податке који су претходно сачуване. 70 00:03:50,810 --> 00:03:54,070 По дефаулту, фајл отворимо, ако већ не постоји, 71 00:03:54,070 --> 00:03:57,180 се креира у нашем садашњем радном директоријуму. 72 00:03:57,180 --> 00:04:00,540 Међутим, ако желимо да приступите или направите датотеку на другој локацији, 73 00:04:00,540 --> 00:04:02,650 у првом аргументу оф фопен, 74 00:04:02,650 --> 00:04:05,840 можемо одредити путању датотеке поред имена датотеке. 75 00:04:05,840 --> 00:04:09,490 Док је први део овог процеса је само једна линија кода дуго, 76 00:04:09,490 --> 00:04:12,350 увек је добра пракса да се укључи још један скуп линија 77 00:04:12,350 --> 00:04:15,930 да проверите да обезбеди да је датотека успешно отворена или креирана. 78 00:04:15,930 --> 00:04:20,300 Ако фопен враћа нулл, ми не бисмо желели да крене напред са нашим програмом, 79 00:04:20,300 --> 00:04:23,270 а то се може десити ако је оперативни систем без меморије 80 00:04:23,270 --> 00:04:27,940 или ако покушате да отворите датотеку у директоријум за који нисмо имали одговарајуће дозволе. 81 00:04:27,940 --> 00:04:31,780 >> Други део процеса одвија у вхиле петље писаћа машина је. 82 00:04:31,780 --> 00:04:35,000 Ми користимо ЦС50 библиотеке функцију да би улаз од корисника, 83 00:04:35,000 --> 00:04:37,190 и под претпоставком да они не желе да напусти програм, 84 00:04:37,190 --> 00:04:41,940 користимо функцију фпутс да узме стринг и запишите га у датотеку. 85 00:04:41,940 --> 00:04:46,700 фпутс је само једна од многих функција можемо да користимо за писање у датотеку. 86 00:04:46,700 --> 00:04:51,920 Друге могу фврите, фпутц, па чак и фпринтф. 87 00:04:51,920 --> 00:04:54,840 Без обзира на одређеној функцији завршимо коришћење, међутим, 88 00:04:54,840 --> 00:04:57,480 сви треба да знају, преко својих аргумената, 89 00:04:57,480 --> 00:04:59,670 најмање две ствари - 90 00:04:59,670 --> 00:05:03,140 оно што треба да буде написан и где треба да буде написан на. 91 00:05:03,140 --> 00:05:07,240 У нашем случају, улаз је стринг који треба да буде написан 92 00:05:07,240 --> 00:05:11,290 и фп је показивач који нас упућује где пишемо. 93 00:05:11,290 --> 00:05:15,330 У овом програму, други део процеса је прилично једноставно. 94 00:05:15,330 --> 00:05:17,360 Ми једноставно узимате стринг од корисника 95 00:05:17,360 --> 00:05:22,120 и да га додате директно у нашој датотеци са мало до нема улаз валидација или безбедносне провере. 96 00:05:22,120 --> 00:05:26,160 Често, међутим, други део ће се највећи део кода. 97 00:05:26,160 --> 00:05:30,580 Коначно, трећи део је на линији 58, где смо затворили датотеку. 98 00:05:30,580 --> 00:05:34,860 Овде зовемо фцлосе и проследи је наш оригинални показивач датотеке. 99 00:05:34,860 --> 00:05:39,500 У наредном реду, враћамо нула, сигнализацију крај нашег програма. 100 00:05:39,500 --> 00:05:42,630 И, да, трећи део је као једноставан као тај. 101 00:05:42,630 --> 00:05:45,260 >> Идемо на читање из датотеке. 102 00:05:45,260 --> 00:05:48,220 Назад у нашем каталогу имамо фајл под називом принтер.ц. 103 00:05:48,220 --> 00:05:50,910 Хајде да пробамо са датотеком смо управо креирали - 104 00:05:50,910 --> 00:05:53,350 доц.ткт. 105 00:05:53,350 --> 00:05:58,150 Овај програм, као што име сугерише, једноставно ће штампати садржај датотеке прошао на њега. 106 00:05:58,150 --> 00:06:00,230 И тамо га имамо. 107 00:06:00,230 --> 00:06:03,780 Линије кода смо унели раније и чувају у доц.ткт. 108 00:06:03,780 --> 00:06:06,980 Здраво. Моје име је Џејсон. 109 00:06:06,980 --> 00:06:09,120 Ако смо зароните у принтер.ц, 110 00:06:09,120 --> 00:06:13,570 видимо да доста кода личи на оно што смо управо ушао кроз у типевритер.ц. 111 00:06:13,570 --> 00:06:16,720 Заиста линија 22, где смо отворили датотеку, 112 00:06:16,720 --> 00:06:19,220 и линија 39, где смо затворени фајл, 113 00:06:19,220 --> 00:06:23,890 су и готово идентичне типевритер.ц, осим фопен други аргумент. 114 00:06:23,890 --> 00:06:26,510 Овај пут смо читање из датотеке, 115 00:06:26,510 --> 00:06:29,040 тако да смо изабрали р уместо ж. 116 00:06:29,040 --> 00:06:31,950 Тако, хајде да се фокусирамо на другом делу процеса. 117 00:06:31,950 --> 00:06:36,060 У складу 35, као други услов у нашој 4 петље, 118 00:06:36,060 --> 00:06:38,590 смо упутили позив фгетс, 119 00:06:38,590 --> 00:06:42,190 пратилац функција фпутс од раније. 120 00:06:42,190 --> 00:06:44,660 Овај пут имамо три аргументе. 121 00:06:44,660 --> 00:06:48,810 Први је показивач на низ знакова где ће жица бити ускладиштене. 122 00:06:48,810 --> 00:06:52,670 Други је максималан број карактера који се чита. 123 00:06:52,670 --> 00:06:56,010 И трећи је показивач датотеке са којима радимо. 124 00:06:56,010 --> 00:07:00,780 Приметићете да је за петљу завршава када фгетс враћа нулл. 125 00:07:00,780 --> 00:07:02,940 Постоје два разлога да то може да се деси. 126 00:07:02,940 --> 00:07:05,380 Прво, можда је дошло до. 127 00:07:05,380 --> 00:07:10,740 Друго, и још вероватније, крај датотеке је постигнут и нема више знакова су читати. 128 00:07:10,740 --> 00:07:14,040 У случају да се питате, две функције не постоје које нам омогућавају да кажем 129 00:07:14,040 --> 00:07:17,160 Разлог што је узрок овом нулл поинтер. 130 00:07:17,160 --> 00:07:21,090 И, што није изненађујуће, јер морају да раде за рад са датотекама, 131 00:07:21,090 --> 00:07:26,940 како феррор функција и функција феоф почињу са словом ф. 132 00:07:26,940 --> 00:07:32,130 >> Најзад, пре него што закључимо, једно кратко обавештење о крају датотеке функције, 133 00:07:32,130 --> 00:07:36,690 који је, како управо поменуо, је написан као феоф. 134 00:07:36,690 --> 00:07:41,550 Често ћете се наћи користе док и петље да се прогресивно чита свој пут кроз фајлова. 135 00:07:41,550 --> 00:07:45,790 Дакле, мораћете начин да оконча ове петље након што до краја ових фајлова. 136 00:07:45,790 --> 00:07:50,510 Позивање феоф на фајл показивач и провере да ли је то истина 137 00:07:50,510 --> 00:07:52,310 ће учинити управо то. 138 00:07:52,310 --> 00:07:59,820 Тако, док се петља са условом (феоф (ФП)!) Може изгледати као савршено решење одговарајуће. 139 00:07:59,820 --> 00:08:03,770 Ипак, кажу да имамо једну линију остало у нашем текстуалном фајлу. 140 00:08:03,770 --> 00:08:07,130 Ми ћемо ући наш петље вхиле и све ће радити како је планирано. 141 00:08:07,130 --> 00:08:12,750 На следећој рунди кроз наш програм ће проверити да ли феоф оф ФП је истина, 142 00:08:12,750 --> 00:08:15,430 али - и то је кључна тачка овде разумети - 143 00:08:15,430 --> 00:08:17,770 то неће бити истина само још. 144 00:08:17,770 --> 00:08:21,110 То је зато што је сврха феоф није да провери 145 00:08:21,110 --> 00:08:24,400 ако следећи позив на читање функција ће се појавити до краја датотеке, 146 00:08:24,400 --> 00:08:28,190 већ да провери да ли је или није крај фајла је већ постигнут. 147 00:08:28,190 --> 00:08:30,140 У случају овог примера, 148 00:08:30,140 --> 00:08:32,780 читања последњу линију нашег фајла иде савршено глатко, 149 00:08:32,780 --> 00:08:36,210 али програм још увек не зна да смо стигли до краја нашег фајла. 150 00:08:36,210 --> 00:08:40,549 То није све док се не једну додатну прочитао да она бројачи краја датотеке. 151 00:08:40,549 --> 00:08:43,210 Дакле, тачно стање би бити следећи: 152 00:08:43,210 --> 00:08:49,330 фгетс и њене три аргументи - излаз, величине производње, и ФП - 153 00:08:49,330 --> 00:08:52,570 и све то није једнако нулл. 154 00:08:52,570 --> 00:08:55,260 То је приступ који смо узели у принтер.ц, 155 00:08:55,260 --> 00:08:57,890 и у овом случају, после петље излаза, 156 00:08:57,890 --> 00:09:04,290 могли назвати феоф или феррор да обавести корисника као специфичног образложење за излазак из ове петље. 157 00:09:04,290 --> 00:09:08,100 >> Писање и читање из датотеке је, у свом најосновнијем, 158 00:09:08,100 --> 00:09:10,150 једноставна 3-дио процеса. 159 00:09:10,150 --> 00:09:12,530 Прво, ми смо отворили датотеку. 160 00:09:12,530 --> 00:09:16,740 Друго, ми смо ставили неке ствари у нашој датотеци или да неке ствари од тога. 161 00:09:16,740 --> 00:09:19,200 Треће, ми смо затворили датотеку. 162 00:09:19,200 --> 00:09:21,170 Први и последњи делови су лако. 163 00:09:21,170 --> 00:09:23,920 Средњи део је где лукав ствари лежи. 164 00:09:23,920 --> 00:09:27,760 И мада испод хаубе смо увек имамо посла са дугом низу нула и јединица, 165 00:09:27,760 --> 00:09:30,710 то не помаже када кодирање да додате слој апстракције 166 00:09:30,710 --> 00:09:35,350 који претвара низ у нешто што више личи оно што смо навикли да видимо. 167 00:09:35,350 --> 00:09:39,570 На пример, ако радите са 24-битном битмап фајл, 168 00:09:39,570 --> 00:09:43,290 ћемо вероватно ће бити читања или писања три бајта у једном тренутку. 169 00:09:43,290 --> 00:09:46,450 У том случају, било би смисла да се дефинише и адекватно име 170 00:09:46,450 --> 00:09:48,980 струцт који је 3 бајта велики. 171 00:09:48,980 --> 00:09:51,410 >> Мада раде са датотекама може изгледати компликован, 172 00:09:51,410 --> 00:09:54,530 користи им омогућава нам да урадимо нешто заиста изузетан. 173 00:09:54,530 --> 00:09:58,880 Можемо променити стање у свету изван нашег програма, 174 00:09:58,880 --> 00:10:01,730 можемо створити нешто што живи изван живота нашег програма, 175 00:10:01,730 --> 00:10:07,190 или можемо чак и да промените нешто што је створено раније наш програм почео да бежи. 176 00:10:07,190 --> 00:10:11,210 Интеракција са фајловима је заиста моћан део програма у Ц 177 00:10:11,210 --> 00:10:15,300 и ја сам узбуђен да видим шта ћеш да направите са њим у коду да дође. 178 00:10:15,300 --> 00:10:19,770 Моје име је Џејсон Хирсцххорн. Ово је ЦС50. 179 00:10:19,770 --> 00:10:21,770 [ЦС50.ТВ] 180 00:10:21,770 --> 00:10:25,940 >> [Смех] 181 00:10:25,940 --> 00:10:29,330 Ок. Један узети. Идемо. 182 00:10:49,000 --> 00:10:52,140 Када размишљамо о датотеци - >> Ох, чекај. Извините. 183 00:10:52,140 --> 00:10:56,800 [Смех] У реду. 184 00:11:06,620 --> 00:11:09,970 Здраво. 185 00:11:13,670 --> 00:11:16,310 Када мислимо датотеке - 186 00:11:17,610 --> 00:11:20,710 Када мислите о фајлу - Ок. Реците ми кад сте спремни. 187 00:11:20,710 --> 00:11:22,520 Ох, сјајно. 188 00:11:22,520 --> 00:11:26,180 Иако читање са телоп може да изгледа - не. Моја грешка.