[Powered by Google Translate] [File I / O]
[Джейсон Хиршхорн, Гарвардский университет]
[Это CS50, CS50.TV]
Когда мы думаем о файле, что приходит на ум это документ Microsoft Word,
изображений JPEG, MP3 или песню,
и мы взаимодействуем с каждым из этих типов файлов различными способами.
Например, в документе Word мы добавим текст
в то время как с изображением JPEG мы могли бы обрезать края или отретушировать цвета.
Тем не менее, под капотом все файлы в нашем компьютере являются не более
чем длинная последовательность нулей и единиц.
Это зависит от конкретного приложения, которое взаимодействует с файлом
чтобы решить, как обработать эту длинную последовательность и представить его пользователю.
С одной стороны, документ может смотреть только на один байт,
или 8 нулей и единиц, а также отображать ASCII символов на экране.
С другой стороны, растровые изображения могут смотреть на 3 байта,
или 24 нулей и единиц,
и интерпретировать их как 3 шестнадцатеричных чисел
, которые представляют значения для красного, зеленого и синего
В один пиксель изображения.
Все, что они могут выглядеть на экране, по сути своей,
Файлы являются не более чем последовательность из нулей и единиц.
Так что давайте нырять и смотреть на то, как мы на самом деле манипулировать этими нулями и единицами
когда дело доходит до записи и чтения из файла.
>> Я начну разбить его на простые 3-часть процесса.
Далее, я буду нырять на две примеры кода, демонстрирующие эти три части.
Наконец, я рассмотрю процесс и некоторые из его наиболее важные детали.
Как и с любой файл, который находится на рабочем столе,
Первое, что нужно сделать, это открыть его.
В C мы делаем это, объявив указатель на предопределенные структуры
, что представляет собой файл на диске.
В этом вызове функции, мы также решить, хотим ли мы писать или читать из файла.
Далее, мы делаем фактически чтения и записи.
Есть целый ряд специализированных функций, мы можем использовать в этой части,
и почти все они начинаются с буквы F, которая выступает за файл.
Последнее, похожее на маленький красный крестик в правом верхнем углу открытых файлов на вашем компьютере,
мы закрываем файл с окончательным вызова функции.
Теперь у нас есть общее представление о том, что мы собираемся делать,
Давайте погрузимся в код.
>> В этом каталоге мы имеем два C файлы и их соответствующие исполняемые файлы.
Машинки программа занимает одно аргумент командной строки,
Название документа мы хотим создать.
В этом случае, мы будем называть его doc.txt.
Давайте запустим программу и введите пару строк.
Привет. Меня зовут Джейсон.
Наконец, мы типа "бросить".
Если мы сейчас перечислим все файлы в данном каталоге,
мы видим, что новый документ существует, называется doc.txt.
Это файл этой программы только что создали.
И, конечно, это тоже не более, чем длинная последовательность нулей и единиц.
Если мы откроем этот новый файл,
мы видим 3 строки кода мы вошли в нашу программу -
Привет. Май имя Джейсон.
Но то, что происходит на самом деле, когда typewriter.c работает?
В первой строке интерес для нас является линией 24.
В соответствии с этим мы заявляем о нашей указателя файла.
Функция, которая возвращает этот указатель, Еореп, принимает два аргумента.
Первое имя файла включая расширение файла, если необходимо.
Напомним, что расширение файла не влияет на файл на самом низком уровне.
Мы всегда имеем дело с длинной последовательности нулей и единиц.
Но это влияние, как файлы интерпретируются и какие приложения используются, чтобы открыть их.
Второй аргумент Еореп является одной буквы
что стоит за то, что мы планируем сделать после открытия файла.
Есть три варианта для этого аргумента - W, R, и А.
Мы выбрали W в этом случае, потому что мы хотим записать в файл.
R, как вы можете догадаться, предназначен для чтения в файл.
А для добавления к файлу.
В то время как вес и может быть использован для записи файлов,
W начнем писать от начала файла
и потенциально перезаписать все данные, которые ранее были сохранены.
По умолчанию, мы открываем файл, если он еще не существует,
создается в нашем нынешнем рабочем каталоге.
Однако, если мы хотим получить доступ или создать файл в другом месте,
В первый аргумент Еореп,
мы можем указать путь к файлу, в дополнение к имени файла.
В то время как первая часть этого процесса является только одной строки кода длиной,
это всегда хорошая практика, чтобы включить другой набор линий
что убедитесь, что файл был успешно открыт или создан.
Если Еореп возвращает нуль, мы не хотели бы продвигаться вперед с нашей программой,
и это может произойти, если операционная система вышла из памяти
или, если мы попытаемся открыть файл в каталог, для которого у нас не было соответствующих разрешений.
>> Вторая часть процесса проходит в то время как цикл пишущей машинки.
Мы используем CS50 библиотечные функции для получения данных от пользователя,
и предполагая, что они не хотят, чтобы выйти из программы,
мы используем функцию fputs взять строку и записать ее в файл.
fputs является лишь одной из многих функций мы могли бы использовать для записи в файл.
Другие включают FWRITE, fputc, и даже Fprintf.
Независимо от конкретной функции, мы в конечном итоге, используя, однако,
все они должны знать, через свои аргументы,
по крайней мере, две вещи -
что должно быть написано и где оно должно быть записано.
В нашем случае, вход строку, которая должна быть записана
и FP является указателем, который направляет нас туда, где мы пишем.
В этой программе, частью второй процесс достаточно прост.
Мы просто принимает строку от пользователя
и добавив его непосредственно в наш файл с небольшим до проверки не вход или проверок безопасности.
Часто, однако, вторая часть будет занимать большую часть вашего кода.
И, наконец, третья часть находится на линии 58, где мы закрываем файл.
Здесь мы называем Fclose и передать его нашим оригинальный указатель файла.
В последующие линии, мы возвращаемся нулю, что свидетельствует о конце нашей программы.
И, да, третья часть так же просто, как это.
>> Давайте перейдем к чтению из файлов.
Вернуться в нашем каталоге у нас есть файл с именем printer.c.
Давайте запустим его с файла, который мы только что создали -
doc.txt.
Эта программа, как следует из названия, будет просто распечатать содержимое файла передается ему.
И у нас это есть.
Строк кода мы ввели раньше и сохраняется в doc.txt.
Привет. Меня зовут Джейсон.
Если мы углубимся в printer.c,
мы видим, что много кода похоже на то, что мы просто шли через в typewriter.c.
Действительно линии 22, где мы открыли файл,
и линия 39, где мы закрыли файл,
оба почти идентичны typewriter.c, за исключением Еореп второй аргумент.
На этот раз мы читаем из файла,
таким образом, мы выбрали г вместо ш.
Таким образом, давайте сосредоточимся на второй части процесса.
В строке 35, а второе условие в нашем 4 петли,
мы делаем вызов ЕдеЬз,
компаньоном функции fputs, чем прежде.
На этот раз у нас есть три аргумента.
Первым из них является указателем на массив символов, где строка будет сохранена.
Во-вторых, это максимальное число символов для чтения.
И, в-третьих, указатель на файл, с которым мы работаем.
Вы заметите, что цикл заканчивается, когда ЕдеЬз возвращает нулевое значение.
Есть две причины, что это может случиться.
Во-первых, произошла ошибка.
Во-вторых, и это более вероятно, конец файла был достигнут, и не более символов читали.
В случае, если Вы задаетесь вопросом, две функции действительно существуют, что позволяет нам говорить
Причина которая является причиной для данного указателя NULL.
И не удивительно, так как они имеют отношение к работе с файлами,
как FERROR функции и начала feof функции с буквой F.
>> Наконец, прежде чем мы заключаем, одно небольшое замечание о конце файла функции,
, который, как только что говорилось, записывается в виде feof.
Часто вы будете использовать время и для петли постепенно читал ваш путь через файлы.
Таким образом, вы будете нуждаться в путь к прекращению этих петель после того, как вы дойдете до конца этих файлов.
Вызов feof на указатель файла и проверки, чтобы увидеть, если это правда
бы сделать именно это.
Таким образом, в то время как цикл с условием (! Feof (FP)) может показаться вполне подходящим решением.
Тем не менее, у нас есть одна линия остается в наших текстовых файлов.
Мы будем вводить наши в то время как петли и все будет работать так, как планировалось.
На следующий раунд до конца, наша программа будет проверять, если feof ПС, правда,
но - и это ключевой момент для понимания здесь -
это не будет истинным только пока.
Это потому, что цель feof не проверить
если при следующем вызове функция чтения попадет в конец файла,
а проверить, является ли или нет конец файла уже достигнута.
В данном примере,
чтение последней строке нашего файла идет идеально ровно,
но программа еще не знает, что мы попали в конце нашего файла.
Это не пока он не один дополнительный прочитал, что это счетчики конце файла.
Таким образом, правильное условие может быть следующим:
ЕдеЬз и трех аргументов - выход, размер выходного и FP -
и все, что не равна нулю.
Это подход, который мы взяли в printer.c,
и в этом случае, после цикла выходит,
Вы могли бы назвать feof или FERROR сообщить пользователю, как к конкретной аргументации для выхода из этого цикла.
>> Запись и чтение из файла, на самом базовом,
Простой 3-часть процесса.
Во-первых, мы открываем файл.
Во-вторых, мы ставим некоторые вещи в нашей файл или принять некоторые вещи из него.
В-третьих, мы закрываем файл.
Первая и последняя части легко.
В средней части, где лежит сложный материал.
И хотя под капотом мы всегда имеем дело с длинной последовательности нулей и единиц,
оно помогает при кодировании, чтобы добавить слой абстракции
Получается, что последовательность в то, что больше напоминает то, что мы привыкли видеть.
Например, если мы работаем с 24-битной растровый файл,
мы, вероятно, будет читать или писать три байта за один раз.
В таком случае, это имело бы смысл, чтобы определить и соответствующим образом назвать
структуру, которая составляет 3 байта большой.
>> Хотя работа с файлами может показаться сложным,
использование их позволяет нам сделать что-то действительно замечательное.
Мы можем изменить состояние мира за пределами нашей программе,
мы можем создать то, что живет за жизнь нашей программы,
или мы можем даже изменить то, что было создано до нашей программе начали работать.
Взаимодействие с файлами это действительно мощная часть программирования на языке C.
и я рад видеть, что вы собираетесь создать с ним в коде, чтобы прибыть.
Меня зовут Джейсон Хиршхорн. Это CS50.
[CS50.TV]
>> [Смех]
Хорошо. Один принять. Здесь мы идем.
Когда мы думаем о файле - >> Ой, подождите. Извините.
[Смех] Хорошо.
Эй там.
Когда мы думаем о файле -
Когда вы думаете о файле - Хорошо. Скажите, когда вы будете готовы.
О, отлично.
Хотя чтение с телесуфлера может показаться - нет. Мое плохое.