>> Говорник: Досега, тоа е веројатно дека повеќето од вашите програми
биле малку ефемерни.
Ќе ја стартувате програмата како Марио или алчна.
Тоа прави нешто, што можеби и го поттикнува на корисникот за некои информации,
печати некои излез на екран, но потоа, кога вашата програма е готово,
има навистина нема докази постојат тоа беше некогаш работат во на прво место.
Мислам, сигурни, можеби ќе го напуштиле отворете го во терминален прозорец,
но ако го исчистите вашиот екран, има навистина нема докази дека тоа постои.
Ние немаме место за складирање упорни информации, информации
која постои по нашето програма престана да работи,
или не сме се до оваа точка.
За среќа иако, в прави да ни обезбеди со способноста
да го направите ова со спроведување нешто што се нарекува
датотека, структура која во основа претставува датотека која ќе се удвои
кликнете на вашиот компјутер, ако сте користи за да се графички кориснички средина.
Општо земено, кога работат со в, ние сме всушност
случува да се работи со покажувачи да files-- датотека stars--
освен за малку кога зборуваме за неколку
од функциите кои работат со датотека покажувачи.
Вие не треба да имаат навистина ископани премногу длабоко во разбирањето покажувачи
себе.
Има мала teeny малку каде што ние ќе зборуваме за нив,
но генерално датотека покажувачи и покажувачи, а меѓусебно поврзани,
не се иста работа.
>> Сега што мислам кога Велам упорни податоци?
Што е упорни податоци?
Зошто ни е гајле за тоа?
Речеме, на пример, дека сте водење на програма
или сте се препишува на програма која е игра,
а вие сакате да ги пратите на сите потези на корисникот
така што можеби ако нешто тргне наопаку, можете да ги видиш датотека по натпреварот.
Тоа е она што мислиме кога зборува за упорни податоци.
>> Во текот на извршувањето на вашиот програма, на датотеката е создадена.
И кога вашата програма престана да работи,
таа датотека се уште постои на вашиот систем.
И ние може да се погледне во него и да го испита.
И така што програмата ќе биде поставено на направивме некои упорни податоци,
постојат податоци по завршување на програмата заврши трчање.
>> Сега сите овие функции кои работат со создавање на датотеки и манипулирање
нив на различни начини живеат во стандард io.h,
која е насловот датотека која сте најверојатно бил фунта
вклучувајќи и на врвот на прилично многу на сите ваши програми
поради тоа што содржи еден од повеќето корисни функции за нас,
printf, кои, исто така, им овозможува на живее во стандард io.h.
Значи, вие не треба да фунта вклучуваат сите дополнителни датотеки веројатно
со цел да се работи со датотека покажувачи.
>> Сега секоја функција датотеката покажувач, или секоја датотека I / O, влез излез
функција, го прифаќа како една на неговите параметри или влезови
датотека pointer-- освен за еден, fopen, која
е она што го користите за да добиете датотека покажувачот на прво место.
Но откако сте го отвори поднесе и ќе го добиете датотека покажувачи,
тогаш може да ги помине како аргументи за различните функции
ние ќе треба да се зборува за Денес, како и многу други
така што ќе можат да работат со датотеки.
>> Па така постојат шест прилично заеднички основни оние
дека ние ќе треба да се зборува за денес.
fopen и нејзиниот придружник функција запишам, fgetc
и нејзиниот придружник функција fputc, и fread и нејзиниот придружник функција,
fwrite.
Значи, да се добие право во неа.
>> fopen-- она ​​што не го прави тоа?
Па, тоа се отвора на датотеки и да ви дава датотеката покажувач на него,
така што тогаш можете да го користите дека датотеката покажувач како аргумент
со некој од друга датотека I / O функции.
Најважно да се сеќавам со fopen
е дека откако ќе се отвори се поднесе или да направи повик, како онаа тука,
што треба да се провери да бидете сигурни што покажувачот што сте ја добиле назад
не е еднаков на нула.
Ако не сте го гледав видеото на покажувачи, ова не може да има смисла.
Но ако се обидете и dereference нулти покажувач потсетиме,
вашата програма најверојатно ќе страдаат сегментација [Беззвучен].
Ние сакаме да се осигураме дека можеме доби легитимен покажувачот назад.
Поголемиот дел од времето ние ќе има добивано и легитимен покажувачот назад
и тоа нема да биде проблем.
>> Така како ние да се јавам во fopen?
Тоа изгледа доста како тоа.
Датотека ѕвезда ptr-- кон меморија е генеричко именува за датотеката pointer-- fopen
проаѓаат во две работи, на име на датотека и операција ние сакаме да ги преземе.
Така што би можеле да имаат повик што личи this-- датотека ѕвезда кон меморија 1 еднаква fopen
file1.txt.
Како и работата што сте ја одбрале е р.
>> Па што мислите r е тука?
Кои се видови на работи кои сме Може да биде во можност да се направи за да се датотеки?
Така што r е работата што ние изберете кога ќе сакате да ја прочитате датотеката.
Па ние би основа кога ние се направи повик вака
се добива себе датотека покажувачот таква што тогаш би можеле да ги прочитате информациите
од file1.txt.
>> Слично на тоа, ние може да се отвори датотеката 2.txt за пишување и за да можеме да го помине ptr2,
покажувачот на датотеката Јас направивме овде, како аргумент за било која функција што
пишува информации во датотека.
И слични на пишување, има Исто така има опција да се додаде, а.
Разликата помеѓу пишување и дополнување
е во тоа што кога ќе се запишам во датотеката, ако се направи повик до fopen за пишување
и таа датотека веќе постои, тоа е ќе ги избрише целата датотека.
Тоа се случува да се започне на самиот почеток,
бришење на сите информации тоа е веќе таму.
>> А ако го отвори за дополнување, тоа ќе оди на крајот на датотеката
ако има веќе текст во тоа и информации во него,
и тогаш ќе почне пишување од таму.
Така да нема да изгуби било на информациите што сте правеле.
Без разлика дали сакате да се напише или додавај вид зависи од ситуацијата.
Но најверојатно ќе знаат за што право работа е кога ќе дојде време.
Значи тоа е fopen.
>> Што е со запишам?
Па, доста едноставно, запишам само прифаќа покажувачот на датотеката.
И како што би очекувале, го затвора таа датотека.
И еднаш сме затворени датотека, не можеме, вршење на повеќе датотеки на I / O функции,
читање или пишување, на таа датотека.
Ние треба да повторно да се отвори поднесе уште време, со цел
да продолжи да работи со го користите функциите на I / O.
Па запишам значи дека ние сме направиле работа со оваа податотека.
И сите ние треба да помине во е името на датотеката покажувач.
Па на неколку слајдови одамна, ние fopened датотека 1 точка текст за читање
а ние се доделени од кои датотека покажувач на ptr1.
Сега ние одлучивме ние сме направи читањето на таа датотека.
Ние не треба да правите со него.
Можеме само да запишам ptr1.
И слично, дали е запишам еден од нив.
Во ред.
Значи тоа е отворање и затворање.
Тоа се двете основни почнувајќи операции.
>> Сега сакаме да се, всушност, направи некои интересни работи,
и првата функција дека ќе се види дека ќе го направат тоа е fgetc--
поднесе добие карактер.
Тоа е она што генерално fgetc ќе се претвори во.
Неговата цел во животот е да прочитате следните карактер,
или ако ова е вашата Првиот повик за fgetc
за одредена датотека, првиот карактер.
Но, тогаш, по што, ќе го добиете на следниот,
веќе следниот карактер на оваа датотека, и продавници во променлив карактер.
Како што ние го направивме овде, знак гл еднаква fgetc,
помине во името на датотека што го покажувачот.
Повторно, тоа е многу важно тука е да се запамети
дека со цел да се има оваа операција да успее,
самата покажувачот на датотеката Сигурно е отворена за читање.
Ние не може да се чита карактер од датотека покажувачот дека ние отворена за пишување.
Значи, тоа е една од ограничувањата на fopen, нели?
Ние треба да го ограничи себеси само на извршување
една работа со една датотека покажувач.
Ако сакаме да се чита и да пишува од иста датотека,
ќе имаме отворена две одделни датотека покажувачи на истиот file--
еден за читање, по еден за пишување.
>> Значи, повторно, е единствената причина Носам дека до сега е
затоа што ако ние се случува да се направи повик да fgetc, дека датотеката покажувач Сигурно
е отворена за читање.
А потоа прилично едноставно, сите ние треба да направите
се помине во името на покажувачот на датотеката.
Така знак гл еднаква fgetc ptr1.
>> Што се случува да ни се следниот character--
или, повторно, ако ова е прв времето што е направен овој повик,
првиот character-- на она што датотека е посочени од ptr1.
Потсетиме дека тоа беше датотека 1 точка текст.
Тоа ќе ја добие првата карактер на и ние ќе го сместат во променлива поглавје.
Прилично јасна.
Значи ние сме го погледне само три функции и веќе сме
може да направи нешто прилично уредни.
>> Ако се има оваа способност за добивање на знак
и ние јамка it-- па ние продолжи да се ликови
од датотека во текот и одново и over-- сега ние
може да го прочитате секој карактер на датотека.
И ако ние се печати секој лик веднаш откако ќе го прочита,
ние сега читаат од датотека и печатени неговата содржина на екранот.
Ние сме споени ефикасно таа датотека на екранот.
И тоа е она што Linux команда мачка прави.
>> Ако го напишете мачка во името на датотеката, таа ќе се печати ја целата содржина
на датотеката во терминален прозорец вашата.
И така ова малку јамка тука, само три линии на код,
но ефикасно ја дуплира на Linux команда мачка.
Па ова би можело синтакса изгледа малку чудно,
но тука е она што се случува овде.
А гл еднаква fgetc, кон меморија не е еднаква EOF-- тоа е целата залак,
но ајде да се прекине само така што е јасно на синтаксата.
Сум го консолидираше за доброто на просторот,
иако тоа е малку синтаксички незгодно.
>> Па овој дел во зелена право Сега, она што го прави тоа?
Па, тоа е само нашата fgetc повик, нели?
Видовме дека порано.
Тоа е добивање на еден лик од датотека.
Тогаш можеме да ги споредиме дека карактер против EOF.
EOF е посебна вредност, која е дефинирана во стандард io.h, која
е на крајот на датотеката карактер.
Значи, во основа она што ќе се случи е овој циклус ќе ги чита некој знак,
да се спореди со EOF, на крајот на датотеката карактер.
Ако тие не се совпаѓаат, така што не треба стигна до крајот на датотеката,
ние ќе се печати на тој карактер надвор.
Потоа ќе се вратиме на почнувајќи од циклусот повторно.
Ние ќе добие лик, проверете против EOF, печати ја надвор, и така натаму
и така натаму и така натаму, looping преку, на тој начин
додека не сте достигнавме крајот на датотеката.
А потоа од страна на таа точка, ние ќе се печатени
од целата содржина на досието.
Значи, повторно, ние сме само гледа fopen, запишам, и fgetc
и веќе може да се дуплираат терминал команда Линукс.
>> Како што реков на почетокот, имавме fgetc и fputc,
и fputc беше придружник функција на fgetc.
И така, како што можете да си замислите, тоа е пишувањето еквивалентни.
Тоа ни овозможува да се напише еден лик во датотека.
>> Повторно, забелешката се, само како што беше со fgetc, на датотеката
дека пишуваме за Сигурно е отвори за запишување или за дополнување.
Ако се обидеме и да го користите fputc на датотека дека ние сме отворени за читање,
ние ќе треба да страдаат малку грешка.
Но на повикот е прилично едноставна.
fputc капитал А ptr2, сите што се случува да се направи е тоа е
Ќе пишувам писмо во А во датотека 2 точка
текст, кој беше името на датотека која ја отворивме и се доделени
на покажувачот ptr2.
Па ние ќе треба да се напише капитал А да поднесе 2 точка текст.
И ние ќе напише фантастичен укажуваат поднесе 3 точка
текст, кој беше посочен од страна ptr3.
Значи, повторно, прилично јасна тука.
>> Но сега можеме да се направи нешто друго.
Имаме овој пример бевме само одење во текот
за да се биде во можност да реплицира на мачка Linux команда, онаа која отпечатоци од
на екранот.
Па, сега дека ние имаме способност да читаат знаците од датотеките
и пишувате знаци на датотеки, зошто да не само што ја замени
јавам да printf со повик до fputc.
>> И сега имаме дупликат ЦП, многу основни команда Линукс
кои ние разговаравме за пат долг пред во Линукс команди видео.
Имаме ефикасно удвои дека токму тука.
Ние читаш лик и потоа ние сме пишувајќи дека карактер во друга датотека.
Читање од една датотека, пишување на друг, одново и одново
и одново, додека ние хит EOF.
Мораме да се на крајот на поднесе ние се обидуваме да ги копирате од.
А со тоа и ние ќе го имаат напишано сите од ликовите што треба да на датотеката
дека пишуваме да.
Значи ова е вообичаена пракса, командата копија Линукс.
>> На самиот почеток на ова видео, јас го имав протест
дека ние ќе се зборува малку за покажувачи.
Тука е специјално каде сме кога ќе зборуваме за покажувачи
во прилог на датотека покажувачи.
Затоа оваа функција изгледа вид на страшно.
Тоа доби неколку параметри.
Има многу се случува тука.
Има многу различни бои и текстови.
Но, навистина, тоа е само на генерички верзија на fgetc
која ни овозможува да се добие било количина на информации.
Тоа може да биде малку неефикасна, ако ние сме добивање ликови едно по едно време,
процесирањето на фајлот еден карактер во исто време.
Зарем не би било поубаво да се добие 100, во време или 500 во исто време?
>> Па, fread и нејзиниот придружник функција fwrite, што ние ќе зборуваме за
во една секунда, ни дозволуваат да го прават токму тоа.
Ние може да се прочита на произволен износ на информации од датотека
и ние тоа го чувате некаде привремено.
Наместо да бидат во можност да се само тоа се вклопуваат во една променлива,
ние би можеле да треба да се чува во низа.
И така, се поминува во четири аргументи да fread-- покажувач
до локацијата каде сме случува да ја запази информацијата,
колку големи секоја единица на информации ќе биде, колку единици на информации
ние сакаме да се здобијат, како и од датотека која ние сакаме да ги добие.
Веројатно најдобро илустрирано со пример тука.
Значи, да се каже дека ние се изјасни низа од 10 цели броеви.
Ние само што објави на магацинот произволно int ТП 10.
Значи тоа е прилично јасна.
Сега она што го правиме сепак е frecall е што ти ја читаш големината на int
Времето 10 бајти на информации.
Големина на int суштество four-- тоа е на големината на цел број во в.
>> Значи она што го правиме е ние сме читање 40 бајти во вредност од информации
од датотеката посочени од меморија.
И ние сме чување на оние 40 бајти некаде
каде што се издвои 40 бајти во вредност од меморијата.
За среќа, ние сме веќе го направиле тоа од страна на прогласување ARR, таа низа право таму.
Кој е способен за држење 10-бајт четири единици.
Така што во вкупно, тоа може да се одржи 40 бајти во вредност од информации.
И ние сме сега со читање 40 бајти на информации од датотека,
и ние сме чување на тоа во ТП.
>> Потсетиме од видеото на совети кои името на низа, како што ТП,
е навистина само еден покажувач до својот прв елемент.
Значи, кога ќе помине во ТП таму, ние се, всушност, минува во покажувач.
>> Слично на тоа можеме да го направиме this-- ние не мора
треба да се спаси нашата тампон на магацинот.
Ние, исто така, може динамички алоцира тампон вака, употребувајќи Примерок.
Запомнете, кога ние динамички алоцира меморија,
ние сме го заштеда на грамада, не на магацинот.
Но, тоа е уште една тампон.
>> Тоа, сепак, во овој случај, е држи 640 бајти на информации
затоа двојно зазема осум бајти.
А ние бараме за 80 од нив.
Сакаме да имаме простор да се одржи 80 двојки.
Па 80 пати е 8 640 бајти информации.
А тоа е повик да се fread собирање на 640 бајти на информации
од датотеката која покажува меморија и складирање на тоа сега во arr2.
>> Сега ние исто така може да се третираат fread само како повик кон fgetc.
Во овој случај, ние сме само се обидува да добие еден лик од датотека.
И ние не треба низа да се одржи карактер.
Ние само може да се чува во променлив карактер.
>> Фати, сепак, е дека кога ние само треба променлива,
ние треба да помине во адресата на таа променлива
бидејќи се потсетиме дека Првиот аргумент да fread
е покажувач кон локацијата и меморија каде што сакаме да ја запази информацијата.
Повторно, името на Низа е покажувачот.
Така што не треба да направите симболот низа.
Но, в, ликот в тука, не е низа.
Тоа е само една променлива.
И така ние треба да помине симболот C за да се покаже
дека тоа е адресата каде што сакаме за складирање на овие еден бајт на информации,
овој лик кој ние сме се собираат од меморија.
Fwrite-- јас ќе одам преку ова малку повеќе
quickly-- е доста Точниот еквивалент на fread
освен тоа е за пишување наместо на читање, само
како на other-- имавме отворени и блиски, да се добие лик,
напишете карактер.
Сега е се произволни количина на информации,
право произволни количина на информации.
Па како и порано, можеме имаат низа од 10 цели броеви
каде што веќе го имаме информации што се зачувани, можеби.
>> Тоа беше веројатно некои линии на код кои треба да одат меѓу овие два
каде што јас се пополни со ARR нешто значајно.
Јас го пополнат со 10 различни цели броеви.
И наместо тоа, она што јас сум прави е пишано од ТП
како и собирање на информации од ТП.
И јас сум преземање на тие информации и тоа ставање во датотеката.
>> Така, наместо за тоа да се биде од датотека на тампон,
ние сме сега ќе од тампон до датотеката.
Па тоа е само обратно.
Значи, повторно, како и порано, можеме исто така, имаат еден куп парче меморија
дека ние сме динамички доделени и да чита од кои
и пишува дека во датотеката.
>> А имаме и една променлива способен да држи еден бајт
на информации, како што се на карактер.
Но, повторно, ние треба да помине во на адресата на таа променлива
кога сакаме да се прочита од неа.
За да можеме да се пишува на информации ќе најдеме на таа адреса
да го покажувачот на датотеката, кон меморија.
>> Има многу други голема датотека I / O функции
кои прават различни нешта, покрај оние кои ние разговаравме за денес.
Неколку од оние може да најдете корисни
се fgets и fputs, кои се еквивалент
на fgetc и fputc но за читање еден стринг од датотека.
Наместо на еден лик, тоа ќе го прочитаат целиот стринг.
fprintf, кој во основа им овозможува на можете да го користите printf да запишам во датотеката.
Па исто како можете да го направите замена променлива користење
променливи проценти i и проценти г, и така натаму, со printf
на сличен начин можете да ги преземе printf низа и печати нешто
како онаа во датотека.
>> fseek-- ако имате DVD плеер е аналогијата Јас обично користам here--
е вид на како го користите вашиот премотам касетата и брзо напред
копчиња за да се движите низ филмот.
Слично на тоа, можете да се движите низ датотека.
Една од работите внатре таа датотека структура
дека в создава за вас е индикатор од каде што се во датотеката.
Дали сте на самиот почетокот, во бајт нула?
Дали сте во бајт 100, 1.000 бајт, и така натаму?
Можете да го користите fseek произволно да се движат тој показател напред или назад.
>> И ftell, повторно слични на DVD плеер,
е како мала часовник кој ја раскажува вие колку минути и секунди
се во одреден филм.
Слично на тоа, ftell ви кажува колку многу бајти сте во датотеката.
feof е поинаква верзија за откривање дали сте
стигна до крајот на датотеката.
И ferror е функција дека можете да го користите
за да открие дали има нешто нема погрешно работење со некоја датотека.
Повторно, ова е само гребење по површината.
Има уште многу повеќе датотека I / O функции во стандардниот io.h.
Но, ова веројатно ќе ви се добие започна да работи со датотека покажувачи.
Јас сум Даг Лојд.
Ова е CS50.