>> Слухаць: Пакуль што, хутчэй за ўсё, што большасць вашых праграм
было няшмат эфемерным.
Вы запускаеце праграму, як Марыё або прагны.
Гэта нешта робіць, то, магчыма, прапануе карыстальнік нейкую інфармацыю,
раздрукаваць некаторы вывад на экран, але потым, калі ваша праграма скончыцца,
там сапраўды няма доказаў ёсць гэта калі-небудзь працаваць у першую чаргу.
Я маю на ўвазе, вядома, вы маглі б пакінулі гэта адкрыць у акне тэрмінала,
але калі вы ачысціце экран, ёсць ня сапраўды няма доказаў таго, што ён існаваў.
Мы не мець сродкі захоўвання пастаяннай інфармацыі, інфармацыя
што існуе пасля нашага Праграма спынены,
або ў нас ёсць не да гэтай кропкі.
На шчасце, хоць, з робіць даць нам магчымасць
зрабіць гэта шляхам рэалізацыі тое, што называецца
файл, структура, у асноўным ўяўляе сабой файл, які вы б падвоіць
націсніце на кампутары, калі вы выкарыстоўваецца ў графічным асяроддзі карыстальніка.
Наогул пры працы з з, мы на самай справе
будзе працаваць з паказальнікі на файл files-- stars--
для трохі, акрамя калі мы гаворым пра пары
функцый, якія працаваць з паказальнікамі файлаў.
Вам не трэба, каб сапраўды вырылі занадта глыбока ў разуменне паказальнікаў
Самі.
Там трохі маленькі біт дзе мы будзем казаць пра іх,
але, як правіла падаць паказальнікі і паказальнікі, а ўзаемазвязаны,
не зусім тое ж самае.
>> Цяпер тое, што я маю на ўвазе, калі Я кажу пастаянныя дадзеныя?
Што пастаянныя дадзеныя?
Чаму мы клапоцімся пра гэта?
Скажам, напрыклад, што вы працуеце ў праграму
ці вы перапісаць праграма, якая гэта гульня,
і вы хочаце, каб адсочваць усіх хадоў карыстальніка
так што, магчыма, калі нешта пойдзе не так, Вы можаце прагледзець файл пасля гульні.
Вось што мы маем на ўвазе, калі мы казаць аб пастаянных дадзеных.
>> У ходзе працы вашага Праграма, файл ствараецца.
І калі ваша праграма спыніў бег,
што файл ўсё яшчэ існуе на вашай сістэме.
І мы можам глядзець на яго і вывучыць яго.
І так, што праграма будзе ўстаноўлена ў стварылі некалькі пастаянных дадзеных,
існуюць дадзеныя пасля праграмы скончыць працу.
>> Зараз усе гэтыя функцыі, якія працуюць са стварэннем файлаў і маніпулявання
іх рознымі спосабамі жыць у стандартнай io.h,
які ўяўляе сабой файл загалоўка, вы, верагодна, быў фунт
у тым ліку на вяршыні даволі шмат усяго з вашых праграм
таму што яна ўтрымлівае адно з большасць карысных функцый для нас,
Printf, што таксама дазваляе жыве ў стандартным io.h.
Такім чынам, вы не павінны ўключаць у сябе фунт любыя дадатковыя файлы, верагодна,
для таго, каб працаваць з паказальнікамі файлаў.
>> Цяпер кожны функцыя паказальнік файла, або кожны файл уводу-высновы, ўводу-вываду /
Функцыя, прымае ў якасці аднаго яго параметраў або уваходаў
файл pointer-- выключэннем для аднаго, FOPEN, што
гэта тое, што вы карыстаецеся, каб атрымаць файл Паказальнік у першую чаргу.
Але пасля таго як вы адкрылі файл і вы атрымаеце паказальнікі файлаў,
то вы можаце перадаць іх у якасці Аргументы розных функцый
мы будзем казаць аб Сёння, а таксама многія іншыя
так што вы можаце працаваць з файламі.
>> Такім чынам, існуе шэсць даволі агульныя асноўныя,
што мы будзем казаць пра сённяшні дзень.
FOPEN і яго кампаньён Функцыя fclose, fgetc
і яго функцыя спадарожнік fputc, і Fread і яго функцыя спадарожнікам,
FWRITE.
Такім чынам, давайце прама ў яго.
>> fopen-- што ён робіць?
Ну, гэта адкрывае файл, і ён дае паказальнік файла да яго,
так што вы можаце выкарыстоўваць, што паказальнік файла ў якасці аргументу
у любой іншай файл функцыі ўводу / высновы.
Самае галоўнае каб памятаць з FOPEN
з'яўляецца тое, што пасля таго як вы адкрылі файл або зрабіў званок, як адзін тут,
Вы павінны праверыць, каб пераканацца, што паказальнік, які вы атрымалі назад
ня роўны нулю.
Калі вы не глядзелі відэа на паказальнікі, гэта не магло б мець сэнс.
Але калі вы паспрабуеце і разнаймення пусты паказальнік нагадаем,
ваша праграма, верагодна, пакутуюць сегментацыі [неразборліва].
Мы хочам, каб пераканацца, што мы атрымаў законнае паказальнік назад.
Пераважная большасць часу мы будзем атрымалі законнае паказальнік таму
і гэта не будзе праблемай.
>> Так як мы робім заклік да FOPEN?
Гэта выглядае даволі шмат, як гэта.
Файл зорка ptr-- PTR быць агульным Прозвішча, імя, файл pointer-- FOPEN
і мы праходзім ў двух рэчах, імя файла і аперацыя, мы хочам распачаць.
Такім чынам, мы, магчыма, выклік, які выглядае як this-- файл зорка PTR 1 роўная FOPEN
file1.txt.
І аперацыя я выбраў гэта р.
>> Так што вы думаеце г тут?
Якія віды рэчаў, якія мы маглі б зрабіць, каб файлы?
Так г з'яўляецца аперацыя, што мы выбіраць, калі мы хочам, каб прачытаць файл.
Такім чынам, мы б у асноўным, калі мы зрабіць выклік, як гэта
атрымліваць сябе паказальнік файла такім чынам, што мы маглі б прачытаць інфармацыю
ад file1.txt.
>> Аналагічна, мы маглі б адкрыць файл 2.txt для напісання і такім чынам мы можам прайсці ptr2,
файлавы паказальнік Я стварыў тут, ў якасці аргументу любой функцыі,
запісвае інфармацыю ў файл.
І падобна на лісты, ёсць таксама магчымасць дадаваць, а.
Розніца паміж пісаць і дадання
у тым, што, калі вы пішаце ў файл, калі вы робіце выклік FOPEN для напісання
і што файл ужо існуе, гэта збіраецца перапісаць ўвесь файл.
Гэта адбываецца, каб пачаць у самым пачатку,
выдаленне ўсёй інфармацыі што ўжо ёсць.
>> У той час як, калі вы адкрываеце яго для дадання, ён будзе ісці да канца файла
калі ёсць ужо тэкст гэта ці інфармацыя ў ім,
і затым пачне пісаць адтуль.
Такім чынам, вы не страціце любы з Інфармацыя, якую вы рабілі раней.
Калі вы хочаце, каб пісаць ці дадаць роду залежыць ад сітуацыі.
Але вы, верагодна, ведаеце, што ў Права аперацыя, калі прыйдзе час.
Дык вось FOPEN.
>> Што пра fclose?
Ну, даволі проста, fclose проста прымае паказальнік на файл.
І, як вы маглі б чакаць, яна закрывае файл.
І як толькі мы зачынілі файл, мы не можам выконваць больш функцый файл уводу / высновы,
чытання або запісы, на гэтым файле.
Мы павінны зноў адкрыць падаць яшчэ час для таго,
працягваць працаваць з яго з дапамогай функцыі ўводу / высновы.
Так fclose сродкі мы зрабілі працуе з гэтым файлам.
І ўсё, што мы павінны прайсці ў гэта імя паказальніка файла.
Так на пару слізгае назад, мы fopened тэкставы файл 1 кропка для чытання
і мы прызначылі, што падаць паказальнік ptr1.
Цяпер мы вырашылі мы скончыце чытаць з гэтага файла.
Нам не трэба, каб зрабіць больш з ім.
Мы можам толькі fclose ptr1.
І сапраўды гэтак жа, мог мы fclose на іншыя.
Добра.
Так што гэта адкрыццё і закрыццё.
Такія два асноўных пачынаючы аперацый.
>> Цяпер мы хочам на самой справе зрабіць некаторыя цікавыя рэчы,
і першая функцыя, што мы будзем бачыць, што будзе рабіць тое, што fgetc--
падаць атрымаць сімвал.
Гэта тое, што, як правіла fgetc будзе перавесці на.
Яго мэта ў жыцці, каб чытаць наступны знак,
або, калі гэта ваш вельмі Першы выклік fgetc
для канкрэтнага файла, першы знак.
Але пасля гэтага, Вы атрымліваеце наступны,
на наступны характар ​​гэтага файла, і захоўвае яго ў зменнай знакаў.
Як мы зрабілі тут, сімвал ч роўная fgetc,
перадаць імя паказальніка файла.
Зноў жа, гэта вельмі Тут важна памятаць,
што для таго, каб мець гэтая аперацыя ўдасца,
сам паказальнік файла Павінна быць быў адкрыты для чытання.
Мы не можам счытваць сімвал з файла паказальнік, які мы адкрылі для запісу.
Так што гэта адна з Абмежаванні FOPEN, праўда?
Мы павінны абмежаваць самі толькі выконваючы
адна аперацыя з аднаго паказальніка файла.
Калі б мы хацелі, каб чытаць і напісаць з таго ж файла,
мы павінны адкрыць два асобна файлавыя паказальнікі на тым жа file--
адзін для чытання, іншы для запісу.
>> Такім чынам, яшчэ раз, адзіная прычына, Я прыношу што цяпер гэта
таму што, калі мы збіраемся зрабіць званок каб fgetc, што паказальнік файлаў мусяць быць,
быў адкрыты для чытання.
А потым даволі проста, усё, што мы павінны зрабіць,
гэта перадаць ад імя паказальніка файла.
Так сімвал ч роўная fgetc ptr1.
>> Гэта адбываецца, каб нас наступны character--
ці ж, калі гэта першы раз мы зрабілі гэты заклік,
першы character-- за ўсё, што Файл, на які паказвае ptr1.
Нагадаем, што гэта было файл 1 кропка тэкст.
Гэта будзе атрымаць першы сімвал, што і мы захоўваць яго ў зменнай ч.
Даволі проста.
Такім чынам, мы толькі глядзелі на трох Функцыі і мы ўжо
можна зрабіць нешта вельмі акуратны.
>> Так што, калі мы возьмем гэтую здольнасць аб атрыманні характар
і мы пятля it-- таму мы працягваць атрымліваць сімвалы
з файла зноў і зноў і зараз мы over--
можа чытаць кожны Характар ​​файла.
І калі мы друкуем кожны знак адразу пасля прачытаць яго,
мы цяпер чытаць з файла і надрукаваныя яго змесціва на экран.
Мы эфектыўна аб'ядноўваюцца што файл на экране.
І гэта тое, што Каманда котка Linux робіць.
>> Калі вы ўведзяце котку ў імя файла, яго выведзе ўсё змесціва
файла ў акне тэрмінала.
І так гэтая маленькая пятля тут, толькі тры радкі кода,
але гэта эфектыўна дублюе каманда котка Linux.
Так гэты сінтаксіс можа выглядаць крыху дзіўна,
але вось тое, што тут адбываецца.
У той час як г роўная fgetc, PTR ня роўна EOF-- гэта цэлы рот,
але давайце разбіць яго проста так што ясна, пра сінтаксіс.
Я аб'яднаў яго дзеля прасторы,
хоць гэта крыху сінтаксічна складана.
>> Так што гэта частка ў зялёным права Цяпер, што ён робіць?
Ну, гэта як раз наш fgetc выклік, ці не так?
Мы бачылі, што і раней.
Гэта адзін атрымання персанаж з файла.
Затым мы параўноўваем, што характар ​​супраць EOF.
EOF з'яўляецца асаблівае значэнне, што гэта вызначаны ў стандарце, які io.h
канец файла характар.
Таму ў асноўным тое, што адбудзецца гэтая пятля будзе чытаць характар,
параўнаць яго з EOF, то канец файла характар.
Калі яны не супадаюць, так што мы не дасягнулі канца файла,
Мы надрукуем што персанаж.
Тады мы вернемся да пачатку цыкла зноў.
Мы атрымаем характар, праверыць супраць EOF, раздрукаваць яго, і гэтак далей
і гэтак далей, і гэтак далей, цыкл праз такім чынам
пакуль мы не дасягнулі канца файла.
А потым да гэтага моманту, мы надрукавалі
з усяго змесціва файла.
Такім чынам, яшчэ раз, мы бачылі толькі FOPEN, fclose і fgetc
і мы ўжо можам дубляваць тэрмінал каманднай Linux.
>> Як я ўжо сказаў у пачатку, у нас было fgetc і fputc,
і fputc быў спадарожнікам функцыя fgetc.
І так, як вы можаце сабе ўявіць, гэта напісанне эквівалентныя.
Гэта дазваляе нам напісаць адзін знак у файл.
>> Зноў жа, нюанс быцця, толькі як гэта было з fgetc файл
што мы пішам у Павінна было адкрыты для запісу або для дадання.
Калі мы паспрабуем выкарыстаць і fputc на файл што мы адкрылі для чытання,
мы будзе пакутаваць трохі памылцы.
Але выклік даволі проста.
fputc загалоўная А ptr2, усё што збіраецца зрабіць, гэта гэта
збіраюся напісаць ліст у A ў файле 2 пункту
Тэкст, які быў імя з падаць, што мы адкрылі і прызначаны
паказальнік на ptr2.
Такім чынам, мы збіраемся, каб напісаць загалоўная А падаць 2 кропка тэксту.
І мы будзем пісаць ўсклік паказваюць на файл 3 кропка
Тэкст, які быў, на які паказвае ptr3.
Такім чынам, яшчэ раз, даволі простая тут.
>> Але зараз мы можам зрабіць яшчэ адну рэч.
У нас ёсць гэты прыклад мы проста пераходзячы
аб тым, у стане прайграць котку Каманда Linux, той, які выводзіць
на экран.
Ну, цяпер у нас ёсць магчымасць чытаць сімвалы з файлаў
і пісаць сімвалы ў файлах, чаму б нам проста не замяніць, што
каб патэлефанаваць у PRINTF з заклікам fputc.
>> І зараз мы дублююцца пар, вельмі асноўная каманда Linux
што мы гаварылі пра так доўга таму ў Linux каманды відэа.
У нас эфектыўна дублююцца, што прама тут.
Мы чытае сімвал, а затым мы пісаць, што характар ​​у іншы файл.
Чытанне з аднаго файла, напісанне на іншы, зноў і зноў
і зноў, пакуль мы не трапілі EOF.
Мы дабраліся да канца падаць мы спрабуем скапіяваць с.
І што мы будзем мець напісана з персанажаў трэба ў файл
што мы пішам ст.
Так што гэта пар, каманда Linux копія.
>> У самым пачатку гэта відэа, я меў агаворку
што мы пагаворым Крыху пра паказальнікаў.
Вось менавіта, дзе мы пагаворым аб паказальніках
Акрамя таго, каб падаць паказальнікі.
Так гэтая функцыя выглядае трохі страшна.
Ён атрымаў некалькі параметраў.
Там вельмі шмат тут адбываецца.
Там шмат розных Колеру і тэксты.
Але на самой справе, гэта проста агульная версія fgetc
што дазваляе атрымаць любы аб'ём інфармацыі.
Гэта можа быць трохі неэфектыўна, калі мы атрыманне сімвалаў па адным,
пераборы файла адзін знак за адзін раз.
Не было б лепш, каб атрымаць 100 у той час, або 500 за адзін раз?
>> Ну, Fread і яго функцыя спадарожнік FWRITE, што мы будзем казаць пра
у секунду, дазваляюць нам зрабіць гэта.
Мы можам прачытаць адвольную колькасць інфармацыі з файла
і мы захоўваем яго недзе часова.
Замест таго, каб мець магчымасць проста змясціць яго ў адной зменнай,
мы, магчыма, спатрэбіцца, каб захаваць яго ў масіве.
І так, мы перадаем ў чатырох аргументы fread-- паказальнік
у месцы, дзе мы знаходзімся збіраецеся захоўваць інфармацыю,
як вялікая кожная адзінка інфармацыі будзе, колькі адзінак інфармацыі
мы хочам, каб набыць, а ад які файл мы хочам, каб атрымаць іх.
Напэўна лепш за ўсё ілюструецца на прыкладзе тут.
Так што давайце казаць, што мы заяўляем масіў з 10 цэлых лікаў.
Мы толькі што абвясцілі на стэк адвольна Int обр 10.
Так што гэта даволі проста.
Цяпер тое, што мы робім, хоць гэта frecall будзе мы чытаем памер Int
раз 10 байт інфармацыі.
Памер INT істоты four-- гэта памер цэлага ліку ў C.
>> Такім чынам, што мы робім, мы чытаем 40 байт інфармацыі варта
з файла, на які паказвае PTR.
І мы тыя, захоўвання 40 байт дзесьці
дзе мы вылучылі 40 байт памяці варта.
На шчасце, мы ўжо зрабілі, што, заявіўшы, апр, што масіў прама там.
Гэта дазваляе ўтрымліваць 10 чатыры байта адзінак.
Такім чынам, у агульнай складанасці, ён можа трымаць 40 байт варта інфармацыі.
І мы зараз праглядаеце 40 байт інфармацыі з файла,
і мы захоўваць яго ў обр.
>> Нагадаем, з відэа на паказальнікі, якія імя масіва, напрыклад, апр,
на самай справе проста паказальнік яго першага элемента.
Таму, калі мы праходзім ў обр там, мы з'яўляюцца, па сутнасці, перадаючы паказальнік.
>> Аналагічна мы можам зрабіць this-- мы не абавязкова
трэба, каб выратаваць наш буфер ў стэку.
Мы маглі б таксама дынамічна размяркоўваць буфернай як гэта, выкарыстоўваючы Таноса.
Памятаеце, калі мы дынамічна вылучаць памяць,
мы эканомім яго на куча, ня стэк.
Але ён па-ранейшаму буфер.
>> Гэта ўсё яшчэ, у дадзеным выпадку, з'яўляецца правядзенне 640 байт інфармацыі
бо двойчы займае восем байт.
І мы просім 80 з іх.
Мы хочам, каб прастору правесці 80 двухмесных.
Так 80 разоў 8640 байт інфармацыі.
І, што выклік з'яўляецца FREAD збор 640 байтаў інфармацыі
ад файла, названага PTR і захоўваць яго ў цяперашні час у arr2.
>> Цяпер мы таксама можам разглядаць Fread гэтак жа, як заклік да fgetc.
У гэтым выпадку, мы проста спрабуем атрымаць адзін сімвал з файла.
І мы не патрэбныя масіў для захоўвання знака.
Мы можам проста захоўваць яго ў пераменная характар.
>> Загвоздка, аднак, у тым, што калі мы проста зменную,
мы павінны перадаць у адрас гэтай зменнай
таму што нагадаць, што Першы аргумент FREAD
з'яўляецца паказальнікам на месца і памяць дзе мы хочам, каб захаваць інфармацыю.
Зноў жа, імя масіва з'яўляецца паказальнікам.
Такім чынам, мы не павінны рабіць Ампэрсанд масіў.
Але з, характар ​​з Тут, не з'яўляецца масівам.
Гэта проста пераменная.
І таму мы павінны прайсці Ампэрсанд з пазначыць
, Што гэта адрас, дзе мы хочам захоўваць гэтую адзін байт інфармацыі,
гэта адзін знак, што мы спагнанні з PTR.
Fwrite-- я пайду праз гэта крыху больш,
quickly-- ў значнай ступені дакладны эквівалент FREAD
акрамя, гэта для напісання замест чытання, проста
як і other-- мы мелі адкрыты і блізка, атрымаць сімвал,
напісаць характар.
Зараз гэта атрымаць адвольнае Колькасць інфармацыі,
Права адвольную колькасць інфармацыі.
Гэтак жа, як раней, мы можам ёсць масіў з 10 цэлых лікаў
дзе ў нас ужо ёсць Інфармацыя, якая захоўваецца, магчыма.
>> Гэта быў, верагодна, некаторыя радкі кода якія павінны ісці паміж гэтымі двума
дзе я запоўніць обр з нешта значнае.
Я запоўніць яго з 10 розных цэлых лікаў.
І наадварот, тое, што я робіце пісьмовага обр
і збору інфармацыі ад обр.
І я вязу гэтую інфармацыю і пакласці яго ў файл.
>> Такім чынам, замест прычым з файл у буфер,
мы цяпер збіраемся ад буфер ў файл.
Так што гэта проста зваротная.
Такім чынам, яшчэ раз, як і раней, мы можам Таксама ёсць куча кавалак памяці
што мы дынамічна выдзелена і чытаць ад
і пішуць, што ў файл.
>> І мы таксама маем адну зменную здольны ўтрымліваць адзін байт
інфармацыі, напрыклад, характар.
Але, зноў жа, мы павінны перадаць у адрас гэтай зменнай
калі мы хочам, каб чытаць з яго.
Такім чынам, мы можам запісаць інфармацыю мы знаходзім па гэтым адрасе
з паказальнікам файла, PTR.
>> Там шмат іншай файле функцыі ўводу / высновы
што рабіць розныя рэчы, акрамя тыя, каго мы сёння гаварылі.
Пару з тых Вы маглі б знайсці карысным
з'яўляюцца fgets і fputs, якія з'яўляюцца эквівалентам
з fgetc і fputc але для чытання адзіная радок з файла.
Замест аднаго знака, ён будзе чытаць ўсю радок.
fprintf, што ў прынцыпе дазваляе выкарыстоўваць Printf запісаць у файл.
Гэтак жа, як вы можаце зрабіць падстаноўка зменнай з выкарыстаннем
Местозаполнители адсоткаў я і адсоткаў д, і гэтак далей, з Printf
Вы можаце так жа ўзяць Printf радок і друк нешта
так у файле.
>> fseek-- калі ў вас ёсць DVD-плэер аналогія я звычайна выкарыстоўваю here--
накшталт як з дапамогай вашага перамотка назад і наперад
кнопкі для перамяшчэння па кіно.
Акрамя таго, вы можаце перамяшчацца па файле.
Адна з рэчаў, унутры Структура файла, што
што з стварае для вас з'яўляецца паказчыкам дзе вы знаходзіцеся ў файле.
Вы на самой пачынаючы, па меншай нулявым байтаў?
Вы ў байт 100, Байт 1000, і гэтак далей?
Вы можаце выкарыстоўваць FSEEK адвольна рухацца гэты паказчык наперад або назад.
>> І ftell, зноў падобны на DVD-плэер,
як маленькі гадзіны, што кажа Вы, колькі хвілін і секунд вы
з'яўляюцца ў прыватнасці фільма.
Сапраўды гэтак жа, ftell раскажа вам, як колькасць байт вы ў файл.
feof іншая версія выяўлення Ці вы маеце
дасягнулі канца файла.
І FERROR з'яўляецца функцыяй што вы можаце выкарыстоўваць
каб выявіць, ці ёсць што-то пайшло не так працаваць з файлам.
Зноў жа, гэта проста падрапаць паверхню.
Там яшчэ шмат больш файлавы ўвод / выснова функцыі ў стандартнай io.h.
Але гэта, верагодна, атрымаеце вы пачаў працаваць з паказальнікамі файлаў.
Я Дуг Лойд.
Гэта CS50.