>> СЛУШАЛИ: Пока что, скорее всего, что большинство ваших программ
было немного эфемерным.
Вы запускаете программу, как Марио или жадный.
Это что-то делает, то, возможно, предложит пользователь какую-то информацию,
распечатать некоторый вывод на экран, но потом, когда ваша программа закончится,
там действительно нет доказательств есть это когда-либо работать в первую очередь.
Я имею в виду, конечно, вы могли бы оставили это открыть в окне терминала,
но если вы очистите экран, есть не действительно нет доказательств того, что он существовал.
Мы не иметь средства хранения постоянной информации, информация
что существует после нашего Программа остановлен,
или у нас есть не до этой точки.
К счастью, хотя, с делает предоставить нам возможность
сделать это путем реализации то, что называется
файл, структура, в основном представляет собой файл, который вы бы удвоить
нажмите на компьютере, если вы используется в графической среде пользователя.
Вообще при работе с с, мы на самом деле
будет работать с указатели на файл 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 раз 8 640 байт информации.
И, что вызов является 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.