>> ГОВОРИ: До сада, вероватно да је већина ваших програма
су мало пролазна.
Ви покренете програм као Марио или похлепан.
То чини нешто, можда затражити да корисник неке информације,
принт неки излаз на екран, али када је ваш програм је завршен,
Заиста нема доказа нема је икада покренути на првом месту.
Мислим, наравно, можда је остало отворити у прозору терминала,
али ако избришете екран, ту је Заиста нема доказа да је постојао.
Ми немамо средства за складиштење упорна информације, информације
да постоји после нашег Програм је престао ради,
или нисмо до овог тренутка.
Срећом ипак, Ц нема дају нам могућност
за то применом нешто што се зове
фајл, структура која у основи представља слику да би удвостручити
кликните на рачунару, ако сте користи у графичком корисничком окружењу.
Генерално када се ради са ц, ми уствари
ће радити са показивачи да филес-- фајл старс--
осим мало када говоримо о пар
функција које рад са датотекама показивачима.
Не морате да стварно ископали предубоко у разумијевање тројкама
сами.
Ту је мало Теени мало где ћемо разговарати о њима,
али генерално филе савете и показивачи, док је повезана,
нису баш иста ствар.
>> Сада шта мислим кад Кажем сталне податке?
Шта је упорне података?
Зашто ми бринемо о томе?
Рецимо, на пример, да да сте покренули програм
или сте преснимити програм који је игра,
и желите да пратите од свих потеза корисничким
тако да мозда ако нешто крене наопако, можете да прегледате фајл после утакмице.
То је оно што смо мислили када смо говоримо о упорних података.
>> У току вођења ваше Програм, датотека се креира.
А када ваш програм је престао ради,
тај документ још увек постоји на вашем систему.
И можемо гледати и испитати га.
И тако тај програм ће бити постављен на су створили неке сталне податке,
подаци постоје након програма је завршио ради.
>> Сада све ове функције које раде са стварањем датотеке и манипулисање
их на разне начине живе у стандардном ио.х,
што је заглавље датотеке које ти си вероватно био фунта
укључујући и оне на врху прилично много све своје програме
јер садржи једну од већина корисних функција за нас,
иф, који такође омогућава живи у стандардном ио.х.
Дакле, не морате да фунта укључује било који додатни фајлови вероватно
како би се рад са датотекама показивачима.
>> Сада сваки функција фајл показивач, или сваки фајл И / О Инпут Оутпут
функција, прихвата као један од његових параметара или улаза
поинтер-- фајл осим за једну, фопен, која
је оно што користите да бисте добили фајл показивач на првом месту.
Али након што сте отворили филе и добићете датотека путоказе,
тада можете их проћи као аргументе различитих функција
ћемо причати о Данас, као и многи други
тако да можете да радите са датотекама.
>> Дакле, постоје шест прилично заједнички основни оне
да ћемо данас говорити.
фопен његов пратилац и Функција фцлосе, фгетц
и његова пратилац функција фпутц, и фреад и његов пратилац функција,
фврите.
Дакле, хајде да се право у њега.
>> фопен-- шта он ради?
Па, то отвара фајл и даје вам фајл показивач на њу,
тако да онда можете користити да филе показивач као аргумент
на било који од другу Филе И / О функције.
Najvažnija stvar да се сетим са фопен
је да након што сте отворили филе или је позив попут оног овде,
морате да проверите да ли да показивач да си се вратио
није једнак нулл.
Ако нисте гледали видео на показивачи, ово не би имало смисла.
Али ако покушаш и дереференце нула показивач опозив,
ваш програм ће вероватно трпети сегментације [неразумљиво].
Желимо да се уверим да Има легитимно показивача леђа.
Огромна већина времена ћемо су добили легитимни показивач назад
и то неће бити проблем.
>> Па како да се позив на фопен?
Изгледа прилично овако.
Величина звездице птр-- ПТР као генерички наме фор филе поинтер-- фопен
и пролазимо у две ствари, име датотеке и операција желимо да предузме.
Тако да можда има позив да личи ово-- фајл са ПТР 1 износи фопен
пример1.ткт.
И операција сам изабрао је Р.
>> Дакле, шта мислите р је овде?
Које су врсте ствари које би могао да уради да би фајлова?
Дакле, р је операција коју смо изабрати када желимо да прочита датотеку.
Тако бисмо у основи када правимо позив овако
да себи добијање фајл показивач тако да бисмо онда могли прочитати информације
од пример1.ткт.
>> Слично томе, можемо отворити датотеке 2.ткт за писање и тако да може да прође птр2,
фајл показивач сам овде направили, као аргумент за било коју функцију која
пише информације у датотеку.
И слично писању, ту је такође опција за додати: а.
Разлика између писање и додавање
будући да када пишете у фајл, ако направите позив да фопен за писање
и да датотека већ постоји, то је ће да замени цео фајл.
То ће почети на самом почетку,
брисање све информације То је већ тамо.
>> Док ако га отворити за додавање, то ће ићи до краја датотеке
ако већ постоји текст у да или информације у њој,
и она ће затим почети писање одатле.
Тако нећете изгубити било који од информације које сте раније.
Било да желите да пишете или додати некако зависи од ситуације.
Али вероватно ћете знати шта је Право операција је када за то дође време.
Дакле, то је фопен.
>> Шта фцлосе?
Па, прилично једноставно, фцлосе само прихвата фајл показивач.
И као што би се могло очекивати, она затвара тај фајл.
И кад смо затворени датотеку, не можемо обављати више Филе И / О функције,
читања или писања, на тај фајл.
Морамо да поново отвори филе други пут како
да настави рад са користећи И / О функције.
Тако фцлосе значи да смо урадили рад са овом фајлу.
И све што је потребно да прође у је име датотеке показивачем.
Дакле, на пар склизне назад, ми фопенед фајл 1 тачка текст за читање
и ми додељен да филе показивач на птр1.
Сада смо одлучили смо врши читање из тог фајла.
Ми не треба да урадите више са њим.
Можемо само мктиме птр1.
Слично томе, могли смо фцлосе остале.
У реду.
Тако да је отварала и затварала.
То су два основна почевши операције.
>> Сада желимо да заиста учинити неке занимљиве ствари,
и прва функција да ћемо видим да ће се то уради је фгетц--
филе добили карактер.
То је оно што фгетц генерално би превести.
Њен циљ у животу је да прочитајте следећи карактер,
или ако је то ваш врло Први позив фгетц
за одређену датотеку, је први карактер.
Али након тога, добијате следећи,
већ следећег карактер тог фајла, и складишти је у променљивој карактер.
Као што смо урадили овде, Чар ЦХ једнако фгетц,
пролазе у име датотеке показивача.
Опет, врло је важно да се присетимо
која да би имали ова операција успе,
сама показивач фајл Мора отворен је за читање.
Ми не може да прочита лик из датотеке показивач који смо отворили за писање.
Дакле, то је један од ограничења фопен, зар не?
Морамо да ограничи сами само на вршење
једна операција са једним датотеке показивачем.
Ако бисмо хтели да читају и пишу из истог фајла,
бисмо имали отворена два одвојена филе показивачи на исти филе--
једна за читање, један за писање.
>> Дакле, поново, једини разлог Ја доносим да до сада
јер ако ћемо да направимо позив да фгетц, тај фајл показивач мора да
отворен је за читање.
А онда прилично једноставно, све што треба да урадите
је прошао у име датотеке показивача.
Дакле, Чар ЦХ једнака фгетц птр1.
>> То ће нас одвести следећи цхарацтер--
или, ако је ово опет прва време направили смо овај позив,
први цхарацтер-- од свега Филе је истакао да од птр1.
Подсетимо се да је то био датотека 1 тачка текста.
То ће добити први карактер који и ми ћемо га сачувати у променљивој цх.
Прилично једноставно.
Тако да смо гледали само на три функције и већ смо
може да уради нешто веома уредан.
>> Дакле, ако узмемо ту способност добијања карактер
а ми петља То-- па смо наставити да се карактере
из датотеке изнова и изнова и овер-- сада
може прочитати сваки карактер датотеке.
И ако ми штампа сваки лик одмах након што смо прочитали,
сада смо прочитали из фајла и штампан њен садржај на екрану.
Ефикасно смо спојени тај документ на екрану.
И то је оно што Линук Цомманд мачка ради.
>> Ако унесете мачку у име датотеке је, ће одштампати цео садржај
датотеке у прозору терминала.
И тако ова мала петља овде, само три линије кода,
али ефективно дуплира Линук команде мачка.
Дакле, ово би могло синтакса изгледају мало чудно,
али ево шта се овде дешава.
Док ЦХ једнако фгетц, ПТР није једнак ЕОФ-- то је цела залогај,
али хајде да их разбијем само тако да је јасно на синтакси.
Ја сам га консолидовани због простора,
иако је мало синтаксически лукав.
>> Дакле, овај део у зеленом права Сада, шта то ради?
Па, то је само наша фгетц позив, зар не?
Видели смо то раније.
То је добијање један лик из датотеке.
Онда смо упореди Карактером против ЕОФ.
ЕОФ је посебна вредност која је дефинисана у стандардном ио.х, који
је крај датотеке карактер.
Дакле, у основи оно што ће се догодити је ова петља ће прочитати карактер,
упоредите га са ЕОФ је крај датотеке карактер.
Ако се не подударају, тако да немамо стигли до краја датотеке,
ми ћемо тај карактер одштампате.
Онда ћемо се вратити до почетак петље поново.
Добићемо карактер, проверите против ЕОФ, одштампајте га, и тако даље
и тако даље и тако даље, петље кроз тај начин
док смо стигли до краја датотеке.
А онда до те тачке, ми ћемо се штампају
од целокупног садржаја списа.
Дакле, опет смо само видели фопен, фцлосе и фгетц
а већ можемо дуплирати Линук терминала команду.
>> Као што сам рекао на почетку, имали смо фгетц и фпутц,
и фпутц је био пратилац функција фгетц.
И тако, као што можете да замислите, то је еквивалент за писање.
То нам омогућава да написати Један знак у датотеку.
>> Опет, упозорење буде, само као што је било са фгетц, датотека
да пишемо да мора да је био отворен за писање или за додавање.
Ако покушамо и користити фпутц на фајлу да смо отворили за читање,
ћемо патити мало грешка.
Али, позив је прилично једноставна.
фпутц капитал птр2, све то ће да уради је да је
ће написати писмо у А у фајлу 2 дот
Текст, који је био назив од филе да смо отворили и добио
се показивач птр2.
Тако ћемо написати капитал А до Филе 2 дот текста.
И ми ћемо писати узвик указују да поднесе 3 дот
Текст, који је истакао да од птр3.
Дакле, опет, веома једноставно овде.
>> Али сада можемо да урадимо још једну ствар.
Ми имамо овај пример ми смо само иде преко
о могућности да понове мачку Линук Цомманд, онај који исписује
на екран.
Па, сад кад имамо могућност да чита ликове из досијеа
и писати знакове фајлове, зашто не бисмо заменити да
звати принтф са позивом да фпутц.
>> И сада смо дуплирати ЦП, једна основна команда за Линук
да смо разговарали о тако дуго Пре у Линук команде видео.
Ми ефективно сам дуплирани да овдје.
Ми читање карактер и онда смо писања тај лик другом фајлу.
Читање из једне датотеке, писање на други, изнова и изнова
и изнова док не ЕОФ хит.
Морамо до краја на филе покушавамо да копирате из.
И по томе ћемо да напише све од ликова треба да датотеку
да пишемо у.
Дакле, ово је ЦП, Линук копија команду.
>> На самом почетку овај видео сам имао примедби
да ћемо причати мало о тројкама.
Ево конкретно где смо ће говорити о тројкама
Поред поднесе савете.
Дакле, ова функција изгледа некако страшно.
Има неколико параметара.
Много се овде дешава.
Има доста другачији боје и текстови.
Али стварно, то је само генерички верзија фгетц
који нам омогућава да се било количина информација.
То може бити мало неефикасан ако смо узимајући карактере један по један,
итератинг кроз фајл један лик у једном тренутку.
Зар не би било лепше да се 100 у једном тренутку, или 500 у исто време?
>> Па, фреад и њен пратилац функција фврите, што ћемо разговарати о
у секунди, омогућавају нам да управо то.
Можемо прочитати произвољну количину информација из датотеке
а ми га чувате негде привремено.
Уместо да буде у стању да само стане га у једном променљивој,
смо можда ћете морати да га чувате у низу.
И тако, пролазимо у четири аргументи да фреад-- показивач
на локацији где ми да складишти информације,
колики свака јединица информације ће бити, колико јединица информација
желимо да стекну, и од који фајл желимо да их добити.
Вероватно најбоље илуструје са пример.
Рецимо да смо изјављујемо низ од 10 целих бројева.
Управо смо прогласили на стацк произвољно инт арр 10.
Дакле, то је прилично једноставан.
Оно што радимо, иако Сада је фрецалл је да читаш величину инт
10 пута бајтова информација.
Величина инт бића фоур-- то величина цео број у ц.
>> Дакле, оно што ми радимо је да читаш 40 бајта вредне информације
из списа који указује ПТР.
И ми смо чување оне 40 бајта негде
где смо издвојили 40 бајта у вредности меморије.
Срећом, ми смо већ урадили од изјављујући обр, да низ тамо.
Који је способан да холдинга 10-бите четири јединице.
Дакле, укупно, она може држати 40 бајтова вредна информација.
И сада читате 40 бајтова информација из списа,
а ми смо га одложио у Арр.
>> Подсетимо од видео на тројкама да име низа, као што Арр,
је заиста само показивач на свом првом елементу.
Дакле, кад прођемо у Арр тамо, су, у ствари, пролази показивачем.
>> Слично можемо да урадимо ово-- ми не нужно
треба да нам спаси бафер на стек.
Ми такође може динамички додели тампон овако, користећи маллоц.
Запамтите, када смо динамички додели меморију,
ми то штеди на гомила, а не стек.
Али то је и даље тампон.
>> То је још увек, у овом случају, је холдинг 640 бајтова података
јер дупло узима осам бајтова.
А ми тражимо за 80 њих.
Желимо да имамо простора држати 80 у дублу.
Дакле, 80 пута 8 је 640 бајтова информација.
И то је позив на фреад прикупљање 640 бајтова података
из списа који указује ПТР и складиштења сада у арр2.
>> Сада можемо третирати фреад баш као позив на фгетц.
У овом случају, ми само покушавамо да добити један знак из датотеке.
И ми не треба Низ да одржи карактер.
Можемо само да га чувате у карактер променљива.
>> Улов је, међутим, да када имамо само променљиву,
треба да прође у адреса променљиве
јер подсјећају да је Први аргумент да фреад
је показивач на локацији и меморије где желимо да сачувате податке.
Опет, име и презиме низ је показивач.
Дакле, не морамо да радимо амперсанд низ.
Али Ц, карактер Ц овде није низ.
То је само променљива.
И тако треба да донесе Амперсанд ц да укаже
да је то адреса где желимо да сачувате ову једну бајт информација,
овај лик који смо прикупљање од ПТР.
Фврите-- ћу проћи кроз ово мало више
куицкли-- је прилично Тачан еквивалент фреад
осим да је за писање уместо читања, само
као да је отхер-- смо имали отворен и близу, добили карактер,
написати карактер.
Сада је добити произвољно количина информација,
Право произвољна количина информација.
Дакле, као и прије, можемо има низ од 10 целих бројева
где већ имамо подаци који се налазе, можда.
>> Вероватно је неки линија кода да иду између ова два
где сам попунити арр са нешто смислено.
Ја га напунити са 10 различитих целих бројева.
А уместо тога, шта ћу ради се писање од Арр
и прикупљању информација из Арр.
И ја узимам ту информацију и ставио га у датотеку.
>> Дакле, уместо да буде од фајл у бафер,
Сада ћемо од тампон до датотеке.
Дакле, то је само обрнуто.
Дакле, опет, као и раније, можемо такође имају хеап комад меморије
да динамички сам издвојила и прочитао од тога
и пишу да у фајлу.
>> А имамо и једну променљиву способан да држи један бајт
информација, као што је карактер.
Али опет, морамо проћи у адреса променљиве
када ми желимо да читамо из њега.
Тако можемо написати информације наилазимо на тој адреси
у фајл показивач, птр.
>> Постоји много других слици И / О функције
да раде разне ствари осим оне које смо данас говорили.
Неколико оних вам може користити
су фгетс и фпутс, који су еквивалентни
од фгетц и фпутц, али за читање један низ из датотеке.
Уместо једног карактера, она ће прочитати целу стринг.
фпринтф, који у основи омогућава да користите принтф да пишем у датотеку.
Дакле, као што можете да урадите променљива замена користећи
плејсхолдере одсто и и посто д, и тако даље, витх принтф
сте на сличан начин може узмите иф стринг и штампање несто
тако да датотеку.
>> фсеек-- ако имате ДВД плејер је аналогија ја обично користе овде--
нешто као користећи своје уназад и брзо напред
тастери за кретање по филм.
Слично томе, можете да се крећете датотеке.
Једна од ствари унутар Структура фајлова који
да Ц креира за вас је показатељ где сте у датотеци.
Да ли сте у самом почетком, на бајт нула?
Да ли сте у бајт 100, бите 1,000, и тако даље?
Можете користити фсеек да произвољно кретање да индикатор напред или назад.
>> И фтелл, опет сличан ДВД плејер,
је као мали сат који говори ви колико минута и секунди Иоу
су у одређеном филм.
Слично томе, фтелл ти како каже многи бајтова сте у датотеку.
феоф је другачија верзија откривања да ли сте
стигли до краја датотеке.
И феррор је функција да можете користити
да открије да ли нешто има пошло наопако рад са фајл.
Опет, ово је само гребања површине.
Има још много више датотека је И / О функције у стандардном ио.х.
Али то ће вероватно ти почео да ради са показивачима датотека.
Ја сам Доуг Лојд.
Ово је ЦС50.