[Powered by Google Translate] [File I / O]
[Джэйсан Хиршхорн, Гарвардскі універсітэт]
[Гэта CS50, CS50.TV]
Калі мы думаем пра файле, што прыходзіць на розум гэта дакумент Microsoft Word,
малюнкаў JPEG, MP3 або песню,
і мы ўзаемадзейнічаем з кожным з гэтых тыпаў файлаў рознымі спосабамі.
Напрыклад, у дакуменце Word мы дадамо тэкст
у той час як з выявай JPEG мы маглі б абрэзаць краю або адрэтушаваны колеру.
Тым не менш, пад капотам усё файлы ў нашым кампутары з'яўляюцца не больш
чым доўгая паслядоўнасць нулёў і адзінак.
Гэта залежыць ад канкрэтнага прыкладання, якое ўзаемадзейнічае з файлам
каб вырашыць, як апрацаваць гэтую доўгую паслядоўнасць і прадставіць яго карыстальніку.
З аднаго боку, дакумент можа глядзець толькі на адзін байт,
або 8 нулёў і адзінак, а таксама адлюстроўваць ASCII сімвалаў на экране.
З іншага боку, растравыя выявы могуць глядзець на 3 байта,
або 24 нулёў і адзінак,
і інтэрпрэтаваць іх як 3 шаснаццатковых лікаў
, Якія прадстаўляюць значэння для чырвонага, зялёнага і сіняга
У адзін піксель малюнка.
Усё, што яны могуць выглядаць на экране, па сутнасці сваёй,
Файлы з'яўляюцца не больш чым паслядоўнасць з нулёў і адзінак.
Так што давайце ныраць і глядзець на тое, як мы на самай справе маніпуляваць гэтымі нулямі і адзінкамі
калі справа даходзіць да запісу і чытання з файла.
>> Я пачну разбіць яго на простыя 3-частка працэсу.
Далей, я буду ныраць на дзве прыклады кода, якія дэманструюць гэтыя тры часткі.
Нарэшце, я разгледжу працэс і некаторыя з яго найбольш важныя дэталі.
Як і з любой файл, які знаходзіцца на працоўным стале,
Першае, што трэба зрабіць, гэта адкрыць яго.
У C мы робім гэта, абвясціўшы паказальнік на наканаваныя структуры
, Што ўяўляе сабой файл на дыску.
У гэтым выкліку функцыі, мы таксама вырашыць, ці жадаем мы пісаць ці чытаць з файла.
Далей, мы робім фактычна чытання і запісы.
Ёсць цэлы шэраг спецыялізаваных функцый, мы можам выкарыстоўваць у гэтай частцы,
і амаль усе яны пачынаюцца з літары F, якая выступае за файл.
Апошняе, падобнае на маленькі чырвоны крыжык у правым верхнім куце адкрытых файлаў на вашым кампутары,
мы закрываем файл з канчатковым выкліку функцыі.
Цяпер у нас ёсць агульнае ўяўленне пра тое, што мы збіраемся рабіць,
Давайце пагрузіліся ў код.
>> У гэтым каталогу мы маем два C файлы і іх адпаведныя выкананыя файлы.
Машынкі праграма займае адно аргумент каманднага радка,
Назва дакумента мы хочам стварыць.
У гэтым выпадку, мы будзем называць яго doc.txt.
Давайце запусцім праграму і ўвядзіце пару радкоў.
Прывітанне. Мяне клічуць Джэйсан.
Нарэшце, мы тыпу "кінуць".
Калі мы зараз пералічым усе файлы ў дадзеным каталогу,
мы бачым, што новы дакумент існуе, называецца doc.txt.
Гэта файл гэтай праграмы толькі што стварылі.
І, вядома, гэта таксама не больш, чым доўгая паслядоўнасць нулёў і адзінак.
Калі мы адкрыем гэты новы файл,
мы бачым 3 радкі кода мы ўвайшлі ў нашу праграму -
Прывітанне. Май імя Джэйсан.
Але тое, што адбываецца на самай справе, калі typewriter.c працуе?
У першай радку цікавасць для нас з'яўляецца лініяй 24.
У адпаведнасці з гэтым мы заяўляем аб нашай паказальніка файла.
Функцыя, якая вяртае гэты паказальнік, Еореп, прымае два аргументу.
Першае імя файла уключаючы пашырэнне файла, калі неабходна.
Нагадаем, што пашырэнне файла не ўплывае на файл на самым нізкім узроўні.
Мы заўсёды маем справу з доўгай паслядоўнасці нулёў і адзінак.
Але гэты ўплыў, як файлы інтэрпрэтуюцца і якія прыкладанні выкарыстоўваюцца, каб адкрыць іх.
Другі аргумент Еореп з'яўляецца адной літары
што стаіць за тое, што мы плануем зрабіць пасля адкрыцця файла.
Ёсць тры варыянты для гэтага аргументу - W, R, і А.
Мы выбралі W ў гэтым выпадку, таму што мы хочам запісаць у файл.
R, як вы можаце здагадацца, прызначаны для чытання ў файл.
А для дадання да файла.
У той час як вага і можа быць выкарыстаны для запісу файлаў,
W пачнем пісаць ад пачатку файла
і патэнцыйна перазапісаць ўсе дадзеныя, якія раней былі захаваныя.
Па змаўчанні, мы адкрываем файл, калі ён яшчэ не існуе,
ствараецца ў нашым цяперашнім працоўным каталогу.
Аднак, калі мы хочам атрымаць доступ або стварыць файл у іншым месцы,
У першы аргумент Еореп,
мы можам паказаць шлях да файла, у дадатак да імя файла.
У той час як першая частка гэтага працэсу з'яўляецца толькі адной радкі кода даўжынёй,
гэта заўсёды добрая практыка, каб уключыць іншы набор ліній
што пераканайцеся, што файл быў паспяхова адкрыты або створаны.
Калі Еореп вяртае нуль, мы не хацелі б прасоўвацца наперад з нашай праграмай,
і гэта можа адбыцца, калі аперацыйная сістэма выйшла з памяці
або, калі мы паспрабуем адкрыць файл у каталог, для якога ў нас не было адпаведных дазволаў.
>> Другая частка працэсу праходзіць у той час як цыкл пішучай машынкі.
Мы выкарыстоўваем CS50 бібліятэчныя функцыі для атрымання дадзеных ад карыстальніка,
і мяркуючы, што яны не хочуць, каб выйсці з праграмы,
мы выкарыстоўваем функцыю fputs ўзяць радок і запісаць яе ў файл.
fputs з'яўляецца толькі адной з многіх функцый мы маглі б выкарыстоўваць для запісу ў файл.
Іншыя ўключаюць FWRITE, fputc, і нават Fprintf.
Незалежна ад канкрэтнай функцыі, мы ў канчатковым выніку, выкарыстоўваючы, аднак,
усе яны павінны ведаць, праз свае аргументы,
па крайняй меры, дзве рэчы -
што павінна быць напісана і дзе яно павінна быць запісана.
У нашым выпадку, уваход радок, якая павінна быць запісана
і FP з'яўляецца паказальнікам, які накіроўвае нас туды, дзе мы пішам.
У гэтай праграме, часткай другой працэс досыць просты.
Мы проста прымае радок ад карыстальніка
і дадаўшы яго непасрэдна ў наш файл з невялікім да праверкі не ўваход ці праверак бяспекі.
Часта, аднак, другая частка будзе займаць вялікую частку вашага кода.
І, нарэшце, трэцяя частка знаходзіцца на лініі 58, дзе мы закрываем файл.
Тут мы называем Fclose і перадаць яго нашым арыгінальны паказальнік файла.
У наступныя лініі, мы вяртаемся нуля, што сведчыць пра канец нашай праграмы.
І, так, трэцяя частка так жа проста, як гэта.
>> Давайце пяройдзем да чытання з файлаў.
Вярнуцца ў нашым каталогу у нас ёсць файл з імем printer.c.
Давайце запусцім яго з файла, які мы толькі што стварылі -
doc.txt.
Гэтая праграма, як вынікае з назвы, будзе проста раздрукаваць змесціва файла перадаецца яму.
І ў нас гэта ёсць.
Радкоў кода мы ўвялі раней і захоўваецца ў doc.txt.
Прывітанне. Мяне клічуць Джэйсан.
Калі мы паглыбімся ў printer.c,
мы бачым, што шмат кода падобна на тое, што мы проста ішлі праз ў typewriter.c.
Сапраўды лініі 22, дзе мы адкрылі файл,
і лінія 39, дзе мы зачынілі файл,
абодва амаль ідэнтычныя typewriter.c, за выключэннем Еореп другі аргумент.
На гэты раз мы чытаем з файла,
такім чынам, мы абралі г замест ш.
Такім чынам, давайце засяродзімся на другой часткі працэсу.
У радку 35, а другая ўмова ў нашым 4 завесы,
мы робім выклік ЕдеЬз,
кампаньёнам функцыі fputs, чым раней.
На гэты раз у нас ёсць тры аргументу.
Першым з іх з'яўляецца паказальнікам на масіў сімвалаў, дзе радок будзе захаваная.
Па-другое, гэта максімальны лік знакаў для чытання.
І, па-трэцяе, паказальнік на файл, з якім мы працуем.
Вы заўважыце, што цыкл сканчаецца, калі ЕдеЬз вяртае нулявое значэнне.
Ёсць дзве прычыны, што гэта можа здарыцца.
Па-першае, адбылася памылка.
Па-другое, і гэта больш верагодна, канец файла быў дасягнуты, і не больш сімвалаў чыталі.
У выпадку, калі Вы задаецца пытаннем, ці дзве функцыі сапраўды існуюць, што дазваляе нам казаць
Прычына якая з'яўляецца прычынай для дадзенага паказальніка NULL.
І не дзіўна, так як яны маюць дачыненне да працы з файламі,
як FERROR функцыі і пачала feof функцыі з літарай F.
>> Нарэшце, перш чым мы заключаем, адно невялікае заўвага пра канец файла функцыі,
, Які, як толькі што гаварылася, запісваецца ў выглядзе feof.
Часта вы будзеце выкарыстоўваць час і для завесы паступова чытаў ваш шлях праз файлы.
Такім чынам, вы будзеце мець патрэбу ў шлях да спынення гэтых завес пасля таго, як вы дойдзе да канца гэтых файлаў.
Выклік feof на паказальнік файла і праверкі, каб убачыць, калі гэта праўда
б зрабіць менавіта гэта.
Такім чынам, у той час як цыкл з умовай (! Feof (FP)) можа здацца цалкам прыдатным рашэннем.
Тым не менш, у нас ёсць адна лінія застаецца ў нашых тэкставых файлаў.
Мы будзем уводзіць нашы ў той час як завесы і ўсё будзе працаваць так, як планавалася.
На наступны раунд да канца, наша праграма будзе правяраць, калі feof ПС, праўда,
але - і гэта ключавы момант для разумення тут -
гэта не будзе сапраўдным толькі пакуль.
Гэта таму, што мэта feof не праверыць
калі пры наступным выкліку функцыя чытання патрапіць у канец файла,
а праверыць, ці з'яўляецца ці не канец файла ўжо дасягнута.
У дадзеным прыкладзе,
чытанне апошняй радку нашага файла ідзе ідэальна роўна,
але праграма яшчэ не ведае, што мы патрапілі ў канцы нашага файла.
Гэта не пакуль ён не адзін дадатковы прачытаў, што гэта лічыльнікі канцы файла.
Такім чынам, правільнае ўмова можа быць наступным:
ЕдеЬз і трох аргументаў - выхад, памер выхаднога і FP -
і ўсё, што не роўная нулю.
Гэта падыход, які мы ўзялі ў printer.c,
і ў гэтым выпадку, пасля цыкла выходзіць,
Вы маглі б назваць feof або FERROR паведаміць карыстальніку, як да канкрэтнай аргументацыі для выхаду з гэтага цыклу.
>> Запіс і чытанне з файла, на самай базавым,
Просты 3-частка працэсу.
Па-першае, мы адкрываем файл.
Па-другое, мы ставім некаторыя рэчы ў нашай файл або прыняць некаторыя рэчы з яго.
Па-трэцяе, мы закрываем файл.
Першая і апошняя часткі лёгка.
У сярэдняй частцы, дзе ляжыць складаны матэрыял.
І хоць пад капотам мы заўсёды маем справу з доўгай паслядоўнасці нулёў і адзінак,
яно дапамагае пры кадаванні, каб дадаць пласт абстракцыі
Атрымліваецца, што паслядоўнасць у тое, што больш нагадвае тое, што мы прывыклі бачыць.
Напрыклад, калі мы працуем з 24-бітнай растравы файл,
мы, верагодна, будзе чытаць ці пісаць 3 байта за адзін раз.
У такім выпадку, гэта мела б сэнс, каб вызначыць і адпаведным чынам назваць
структуру, якая складае 3 байта вялікі.
>> Хоць праца з файламі можа здацца складаным,
выкарыстанне іх дазваляе нам зрабіць нешта сапраўды выдатнае.
Мы можам змяніць стан свету за межамі нашай праграме,
мы можам стварыць тое, што жыве за жыццё нашай праграмы,
ці мы можам нават змяніць тое, што было створана да нашай праграме пачалі працаваць.
Узаемадзеянне з файламі гэта сапраўды магутная частка праграмавання на мове C.
і я рады бачыць, што вы збіраецеся стварыць з ім у кодзе, каб прыбыць.
Мяне клічуць Джэйсан Хиршхорн. Гэта CS50.
[CS50.TV]
>> [Смех]
Добра. Адзін прыняць. Тут мы ідзем.
Калі мы думаем пра файле - >> Ой, пачакайце. Выбачайце.
[Смех] Добра.
Гэй там.
Калі мы думаем пра файле -
Калі вы думаеце пра файле - Добра. Скажыце, калі вы будзеце гатовыя.
О, выдатна.
Хоць чытанне з телесуфлера можа здацца - не. Маё дрэннае.