1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [File I / O] 2 00:00:02,000 --> 00:00:04,000 [Джэйсан Хиршхорн, Гарвардскі універсітэт] 3 00:00:04,000 --> 00:00:07,000 [Гэта CS50, CS50.TV] 4 00:00:07,000 --> 00:00:11,000 Калі мы думаем пра файле, што прыходзіць на розум гэта дакумент Microsoft Word, 5 00:00:11,000 --> 00:00:14,000 малюнкаў JPEG, MP3 або песню, 6 00:00:14,000 --> 00:00:17,000 і мы ўзаемадзейнічаем з кожным з гэтых тыпаў файлаў рознымі спосабамі. 7 00:00:17,000 --> 00:00:20,000 Напрыклад, у дакуменце Word мы дадамо тэкст 8 00:00:20,000 --> 00:00:24,000 у той час як з выявай JPEG мы маглі б абрэзаць краю або адрэтушаваны колеру. 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 нулёў і адзінак, а таксама адлюстроўваць ASCII сімвалаў на экране. 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 У C мы робім гэта, абвясціўшы паказальнік на наканаваныя структуры 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 і амаль усе яны пачынаюцца з літары F, якая выступае за файл. 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 >> У гэтым каталогу мы маем два C файлы і іх адпаведныя выкананыя файлы. 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 У гэтым выпадку, мы будзем называць яго doc.txt. 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 мы бачым, што новы дакумент існуе, называецца doc.txt. 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 Але тое, што адбываецца на самай справе, калі typewriter.c працуе? 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 Ёсць тры варыянты для гэтага аргументу - W, R, і А. 64 00:03:30,630 --> 00:03:34,900 Мы выбралі W ў гэтым выпадку, таму што мы хочам запісаць у файл. 65 00:03:34,900 --> 00:03:38,820 R, як вы можаце здагадацца, прызначаны для чытання ў файл. 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 W пачнем пісаць ад пачатку файла 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 Мы выкарыстоўваем CS50 бібліятэчныя функцыі для атрымання дадзеных ад карыстальніка, 83 00:04:35,000 --> 00:04:37,190 і мяркуючы, што яны не хочуць, каб выйсці з праграмы, 84 00:04:37,190 --> 00:04:41,940 мы выкарыстоўваем функцыю fputs ўзяць радок і запісаць яе ў файл. 85 00:04:41,940 --> 00:04:46,700 fputs з'яўляецца толькі адной з многіх функцый мы маглі б выкарыстоўваць для запісу ў файл. 86 00:04:46,700 --> 00:04:51,920 Іншыя ўключаюць FWRITE, fputc, і нават Fprintf. 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 і FP з'яўляецца паказальнікам, які накіроўвае нас туды, дзе мы пішам. 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 Тут мы называем Fclose і перадаць яго нашым арыгінальны паказальнік файла. 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 Вярнуцца ў нашым каталогу у нас ёсць файл з імем printer.c. 103 00:05:48,220 --> 00:05:50,910 Давайце запусцім яго з файла, які мы толькі што стварылі - 104 00:05:50,910 --> 00:05:53,350 doc.txt. 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 Радкоў кода мы ўвялі раней і захоўваецца ў doc.txt. 108 00:06:03,780 --> 00:06:06,980 Прывітанне. Мяне клічуць Джэйсан. 109 00:06:06,980 --> 00:06:09,120 Калі мы паглыбімся ў printer.c, 110 00:06:09,120 --> 00:06:13,570 мы бачым, што шмат кода падобна на тое, што мы проста ішлі праз ў typewriter.c. 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 абодва амаль ідэнтычныя typewriter.c, за выключэннем Еореп другі аргумент. 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 кампаньёнам функцыі fputs, чым раней. 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 Прычына якая з'яўляецца прычынай для дадзенага паказальніка NULL. 130 00:07:17,160 --> 00:07:21,090 І не дзіўна, так як яны маюць дачыненне да працы з файламі, 131 00:07:21,090 --> 00:07:26,940 як FERROR функцыі і пачала feof функцыі з літарай F. 132 00:07:26,940 --> 00:07:32,130 >> Нарэшце, перш чым мы заключаем, адно невялікае заўвага пра канец файла функцыі, 133 00:07:32,130 --> 00:07:36,690 , Які, як толькі што гаварылася, запісваецца ў выглядзе feof. 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 Выклік feof на паказальнік файла і праверкі, каб убачыць, калі гэта праўда 137 00:07:50,510 --> 00:07:52,310 б зрабіць менавіта гэта. 138 00:07:52,310 --> 00:07:59,820 Такім чынам, у той час як цыкл з умовай (! Feof (FP)) можа здацца цалкам прыдатным рашэннем. 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 На наступны раунд да канца, наша праграма будзе правяраць, калі feof ПС, праўда, 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 Гэта таму, што мэта feof не праверыць 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 ЕдеЬз і трох аргументаў - выхад, памер выхаднога і FP - 153 00:08:49,330 --> 00:08:52,570 і ўсё, што не роўная нулю. 154 00:08:52,570 --> 00:08:55,260 Гэта падыход, які мы ўзялі ў printer.c, 155 00:08:55,260 --> 00:08:57,890 і ў гэтым выпадку, пасля цыкла выходзіць, 156 00:08:57,890 --> 00:09:04,290 Вы маглі б назваць feof або FERROR паведаміць карыстальніку, як да канкрэтнай аргументацыі для выхаду з гэтага цыклу. 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 мы, верагодна, будзе чытаць ці пісаць 3 байта за адзін раз. 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 Узаемадзеянне з файламі гэта сапраўды магутная частка праграмавання на мове C. 177 00:10:11,210 --> 00:10:15,300 і я рады бачыць, што вы збіраецеся стварыць з ім у кодзе, каб прыбыць. 178 00:10:15,300 --> 00:10:19,770 Мяне клічуць Джэйсан Хиршхорн. Гэта CS50. 179 00:10:19,770 --> 00:10:21,770 [CS50.TV] 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 Хоць чытанне з телесуфлера можа здацца - не. Маё дрэннае.