SPEAKER: Досега, най-вероятно че повечето от вашите програми са били малко по-ефимерно. Вие пуснете програма като Mario или алчни. Той прави нещо, то може би подсказва потребителя за някаква информация, отпечатате някои изход на екрана, но тогава, когато програмата ви е свършило, там наистина няма доказателства има тя е все тичам на първо място. Искам да кажа, разбира се, може да са оставили го отворите в терминален прозорец, но ако изчистите екрана, има Наистина няма доказателства, че тя е съществувала. Ние не разполагаме с място за съхранение персистираща информация, информация която съществува след нашата програма е спрял работа, или ние не сме до този момент. За щастие обаче, в прави дайте ни възможност да направите това чрез прилагане нещо, наречено файл, структура, която в общи линии представлява файл, който ще се удвои кликнете на компютъра си, ако сте използван за графичен потребителски среда. Обикновено, когато се работи с с, ние сме всъщност Ще се работи с указатели към files-- файл stars-- с изключение на малко по- когато говорим за една двойка на функциите, работи с файлови указатели. Не е нужно да са наистина вкопана твърде дълбоко в разбирането указатели себе си. Там е малко мъничък малко където ние ще говорим за тях, но като цяло подаде указатели и указатели, докато взаимосвързани, не са точно едно и също нещо. Сега това, което мога да кажа, когато Казвам устойчиви данни? Какво е устойчиви на данни? Защо ни е грижа за него? Кажи, например, че можете да започнете работа с програми или сте пренаписана а програма, която е игра, и искате да следите на всички движения на потребителя така че може би, ако нещо се обърка, можете да прегледате файла след мача. Това е, което имаме предвид, когато говорим за постоянните данни. В хода на пускането на вашите програма, файл е създаден. И когато си програма е спрял работа, този файл все още съществува на вашата система. И ние можем да го разгледат и да го разгледа. И така, тази програма ще се установи на са създали някои постоянни данни, Съществуват данни, след като програмата завърши работи. Сега всички тези функции, които работят със създаване на файлове и манипулиране ги по различни начини живеят в стандартната io.h, което е заглавния файл, че вероятно сте били паунд включително в горната част на доста много по всичките си програми тъй като тя съдържа една от най- повечето полезни функции за нас, ФОРМАТ, че също така ви позволява живее в стандартната io.h. Така че не е нужно да хомогенизира включва всички допълнителни файлове вероятно с цел да се работи с файлови указатели. Сега всеки един функция файлов указател, или всеки един файл I / O, входно-изходна функция, приема като един на неговите параметри или входове файл pointer-- изключение От една страна, fopen, което е това, което се използва за зареждане на файла указател на първо място. Но след като сте отвори подаде и ще получите файлови указатели, След това можете да ги мине за доводите на различните функции ние ще говорим за Днес, както и много други така че можете да работите с файлове. Така че има доста шест общите основни такива че ние ще говоря днес. fopen и неговия спътник функция fclose, fgetc и неговата спътница функция fputc, и fread и неговата спътница функция, неуспешно. Така че нека да получите право в него. fopen-- какво прави той? Е, тя се отваря файл и да го дава файловия указател към него, така че след това можете да използвате, че файлов указател като аргумент която и да е от друга файла I / O функции. Най-важното нещо да се помни с fopen е, че след като сте отворили файл или се обади като този тук, което трябва да се уверете, че показалецът, който се качил обратно не е равно на нула. Ако не сте гледали видеото указатели, това не може да има смисъл. Но ако се опитате и сочен нулев изземване показалеца, вашата програма вероятно ще страдат сегментация [недоловим]. Искаме да сме сигурни, че имам законен показалеца назад. По-голямата част от времето ние ще са придобили законен показалеца назад и това няма да бъде проблем. И как ще се обадя в fopen? Тя изглежда почти като този. File звезда ptr-- PTR е родово име за файла pointer-- fopen и ние преминаваме в две неща, име на файла и операция искаме да предприеме. Така че можем да имаме покана, която прилича this-- файл звезда КОП 1 се равнява на fopen file1.txt. И операцията съм избрал е г. Така че това, което мислите, че г е тук? Какви са видовете неща, които можем може да успеете да направите, за да файлове? Така че R е операция, че избирате, когато искаме да четат даден файл. Така че ние ще основно, когато ние да проведете разговор като този бъдат намалени себе файлов указател така че бихме могли да чете информация от file1.txt. По същия начин, ние може да отвори файл 2.txt за писане и за да можем да преминат ptr2, показалеца на файл съм създал тук, като аргумент за всяка функция, която пише информация във файл. И подобно на писане, има и опция за добавяне, а. Разликата между писане и добавяне е, че когато пишете във файл, ако се обадя в fopen за писане и този файл вече съществува, това е ще презапише цялата преписка. Това ще започне в самото начало, изтриване на цялата информация, че вече е там. Като има предвид, ако го отвори за добавяне, тя ще отиде в края на файла ако има вече текст на тя или информация в него, и тогава той ще започне пише от там. Така че няма да загубят някоя от информация, което сте направили преди. Независимо дали искате да напишете или добавяне нещо зависи от ситуацията. Но най-вероятно ще знаят какво полето на работа е, когато му дойде времето. Така че това е fopen. Какво ще кажете за fclose? Е, доста просто, fclose Просто приема показалеца на файл. И както може да се очаква, тя се затваря този файл. И след като сме затворени файл, не можем да изпълнява всяка по-файл I / O функции, четене или записване, върху този файл. Ние трябва да отвори отново подаде друго време, за да продължи да работи с го използвате функциите на I / O. Така 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, КОП не е равно на EOF-- това е цяло хапка, но нека си го съборят просто така че това е ясно на синтаксиса. Аз съм го консолидира за по-голяма площ, въпреки че е малко синтактично трудни. Така че тази част в зелено полето Сега, това, което го прави? Е, това е само нашето fgetc разговор, нали? Видяхме, че и преди. Той е получаване на един герой от файла. Тогава ние сравняваме, че характер срещу EOF. EOF е специална стойност, която е е определено в стандарт io.h, които е в края на файла характер. Така че основно това, което ще се случи е този цикъл ще прочетете характер, го сравни с EOF г. край на файла характер. Ако те не съвпадат, така че ние не трябва достигнат края на файла, ние ще отпечата, че героя. След това ние ще се върнем към започваща на цикъла отново. Ще получите характер, проверете срещу EOF, отпечатайте го и така нататък и така нататък, и така нататък, присвойте по този начин докато сме достигнали края на файла. И тогава от този момент, ще сме отпечатан от цялото съдържание на файла. Така че отново, ние виждал само fopen, fclose и fgetc и вече можем да дублира терминален команда Linux. Както казах в началото, имахме fgetc и fputc, и fputc беше спътник функция на fgetc. И така, както можете да си представите, това е писмено еквивалент. Тя ни позволява да напише единичен знак във файл. Отново, уговорката е, просто като че ли е с fgetc, файлът че ние сме писмено да му трябва да е отвори за писане или за прикачване. Ако се опитаме и да използвате fputc върху файл че сме отворено за четене, ние ще страдаме малко от грешка. Но поканата е доста проста. fputc капитал A ptr2, всички че това ще се направи, е, че е ще напиша писмото в A в файл 2 точки текстови, което е било името на файл, който отворихме и назначения показалецът да ptr2. Така че ние ще напише капитали A да подаде 2 дот текст. И ние ще пиша удивителен посоча да подаде 3 точки текст, който беше посочен от ptr3. Така че отново, доста ясен тук. Но сега можем да направим още нещо. Имаме този пример ние просто преминавате за да може да се възпроизведе на котката Linux команда, този, който отпечатва на екрана. Е, сега, че ние сме в състояние да се чете символи от файлове и пишат герои да файлове, защо просто не се замести, че призовавам да ФОРМАТ с обаждане до fputc. И сега ние сме дублира ср, много основни команди Linux че ние говорихме за дълъг път Преди в Linux команди видео. Имаме ефективно дублирана, че точно тук. Ние четете характер и след това ние сме писмено, че характера на друг файл. Четене от един файл, писане в друга, отново и отново и отново, докато не удари EOF. Трябва да края на подаде ние се опитваме да копирате от. И от това ще са писали всички от героите трябва да файла че ние сме писмено да. Така че това е ср, командата копие Linux. В самото начало на това видео, аз имах уговорката че ние ще поговорим малко за указатели. Ето конкретно къде сме Ще говорим за указатели в допълнение към файл указатели. Така че тази функция изглежда вид страшно. Тя има няколко параметъра. Има много неща се случват тук. Има много различни цветове и текстове. Но наистина, това е просто родово версия на fgetc която ни позволява да получавате всеки количество информация. Тя може да бъде малко по-неефективна, ако сме получаване на символите един по един, итерации чрез файла един символ в даден момент. Няма ли да е по-хубав, за да получите 100 по време или 500 по време? Е, fread и неговата спътница функция неуспешно, които ние ще говорим за в секунда, ни позволи да направи точно това. Ние може да чете произволно количество на информация от файл и ние го съхранява някъде временно. Вместо да бъде в състояние да просто той се вписва в една променлива, ние може да се наложи да я съхранява в масив. И така, ние преминаваме в четири аргументи, за да fread-- указател до мястото, където сме ще съхранява информация, колко голям всяка единица информация ще бъде, колко единици информация ние искаме да придобият, както и от кой файл искаме да ги вземем. Вероятно най-добре илюстрирано с един пример тук. Така че нека да кажем, че ние заявяваме масив от 10 числа. Ние току-що, обявени на стека произволно INT ARR 10. Така че това е доста ясен. Сега това, което правим, обаче, е на frecall се ние четете размер на инт 10 пъти байта информация. Размер на инт същество four-- това е размера на цяло число в С. Така че това, което правим е, че ние четене 40 байта стойност на информация От преписката, посочи от КОП. И ние сме тези, съхраняване 40 байта някъде където сме заделени 40 байта стойност на паметта. За щастие, ние сме го направили, че от обявяване ARR, че масив точно там. Това е в състояние на стопанството 10 четири-битови възли. Така общо, тя може да побере 40 байта струва на информация. И сега сме четене 40 байта на информация от преписката, и ние сме го приберете в Пр. Спомнете си от видеото на насоки, които Името на масив, като ARR, наистина е само указател неговия първи елемент. Така че, когато се минава през ARR там, ние са, в действителност, преминаваща в указател. По същия начин можем да направим this-- ние не задължително Трябва да спасим нашата буфер в стека. Ние също може динамично да разпредели буфер, подобен на този, с помощта на изчистване. Не забравяйте, че когато ние динамично разпределяне на паметта, ние сме го запазите относно грамада, не стека. Но тя все още е буфер. Тя все още е, в този случай, е държеше 640 байта информация защото двойна заема осем байта. И ние искаме за 80 от тях. Искаме да има пространство да държи 80 двойки. Така 80 пъти 8 е 640 байта информация. И това е призив към fread събиране на 640 байта информация От преписката, посочи от PTR и го приберете в момента в arr2. Сега ние можем да лекува fread точно като призив към fgetc. В този случай, ние просто се опитваме да получите един символ от файла. И ние не се нуждаят от масив за провеждане на характера. Ние просто може да го съхранява в променлив характер. Уловката обаче е, че когато ние просто трябва променлива, ние трябва да премине в адрес на тази променлива Спомнете си, че тъй като Първият аргумент на fread е показалец към местоположението и паметта къде искаме да съхранява информацията. Отново, на името на масив е указател. Така че ние не трябва да правим амперсанд масив. Но в, характера век тук, не е масив. Това е просто една променлива. И така, ние трябва да се явят на амперсанд да посочи в че това е адресът, на който искаме да запазите този един байт на информация, това един знак, че ние сме събиране от КОП. Fwrite-- Ще проверете това малко по- quickly-- е почти точен еквивалент на fread освен това е за писане вместо четене, просто като other-- сме имали отворена и в близост, може да получи характер, напиши характер. Сега е произволна точка количество информация, полето произволно количество информация. Така че точно като преди, можем имаме масив от 10 цели числа където вече имаме информация, запаметена, може би. Вероятно някои реда код че трябва да върви между тези две където I запълни с ARR нещо смислено. Аз го напълни с 10 различни числа. И вместо това, което аз съм прави се пише от ARR и събиране на информацията от ARR. И аз съм като тази информация и да я постави във файла. Така вместо да е от файла на буфера, ние сега става от буфера до преписката. Така че това е просто обратното. Така че отново, точно както и преди, ние можем също имат куп парче от паметта че ние сме динамично разпределени и чете от които и пише, че до преписката. И ние също имаме една променлива може да задържи един байт на информация, като например характер. Но отново, ние трябва да премине в адреса на тази променлива когато искаме да чете от него. Така че ние можем да напиша информацията ние намираме на този адрес до показалеца на файл, PTR. Има много други страхотно файлови I / O функции че правя различни неща, освен тези, които сме говорили за днес. Няколко тези, можете да намерите полезна са fgets и fputs, които са еквивалент на fgetc и fputc но за четене единична низ от файл. Вместо един символ, тя ще прочетете цялата поредица. fprintf, които в общи линии позволява можете да използвате ФОРМАТ да пиша във файла. Така че точно като можете да направите променлива смяна използвайки Запазено място процента I и процента г, и така нататък, с ФОРМАТ можете подобно може да вземе ФОРМАТ низ и печатни нещо като тази във файл. fseek-- ако имате DVD плейър е аналогията Аз обикновено използвам here-- е нещо като използвате вашия превъртане напред и назад бутони, за да се движат около филма. По същия начин, можете да се придвижват в файл. Едно от нещата, вътре че структурата на файла че в създава за вас е индикатор от къде се намирате във файла. Вие сте в самото започваща в байт нула? Вие сте най-байт 100, байт 1000, и така нататък? Можете да използвате fseek произволно да се движат този показател напред или назад. И ftell, отново подобно на DVD плейър, е като малко часовник, който казва, вие колко минути и секунди са в даден филм. По същия начин, ftell ви казва как много байтове ли са във файла. feof е различна версия за откриване дали сте достигнат края на файла. И ferror е функция които можете да използвате да разберем дали има нещо объркало работно с файл. Отново, това е просто надраскване на повърхността. Все още има много по-файл I / O функции в стандартната io.h. Но това вероятно ще можете да получите Започнах работа с файлови указатели. Аз съм Дъг Лойд. Това е cs50.