Функция fopen открывает файл, имя которого указано в параметре fname и связывает его с потоком, который может быть идентифицирован для выполнения различных операций с файлом. Операции с потоком, выполнение которых разрешено определяются параметром modeopen . Cреда программирования поддерживает, по крайней мере, FOPEN_MAX — количество открытых файлов одновременно, где FOPEN_MAX является макро-константа, определенная в .
Параметры:
- fname
Си-строка, содержащая имя файла, который необходимо открыть. Этот параметр должен соответствовать правилам именования файлов в используемой системе, и может включать в себя путь, если система поддерживает его. - modeopen
Строка, содержащая режим доступа к файлу. Далее приведён список режимов и их описание:
Выше указанные спецификаторы режима доступа к файлу используются только в текстовых файлах. Для того, чтобы открыть двоичный файл, символ b должен быть включен в режим доступа. Этот дополнительный символ b может быть добавлен в конец строки, что даёт следующие режимы доступа к бинарным файлам: rb , wb , ab , r+b , w+b , a+b или может быть вставлен между буквой и знаком + , в случае со смешанными режимами: rb+ , wb+ , ab+ .
Язык Си для начинающих / #9 — Работа с файлами
В последовательности спецификаторов доступа могут находиться дополнительные символы, хотя они никак не влияют на работу программы. Например, символ ‘ t ‘ иногда прилагается, чтобы показать, что файл является текстовым.
В случае текстовых файлов, в зависимости от среды, в которой работает приложение, некоторые специальные символы преобразования могут в операциях ввода/вывода могут быть адаптированы к системе, из-за специфического формата текстового файла. Во многих системах, например, UNIX-системах, это не имеет значения ни для открытия файла в текстовом режиме ни для открытия файла в двоичном режиме. Оба попадают точно так же, но адаптация служебных символов рекомендуется для лучшей переносимости.
Для смешанных режимов (те, которые включают в себя знак « + »), когда разрешены операции чтения и записи (или добавления), следует обнулить поток функцией fflush или изменить позицию внутреннего указателя ( fseek fsetpos , rewind ) после операции чтения, за которой следует операция записи и, наоборот, после операции записи, за которой следует операция чтения.
Возвращаемое значение
Если файл был успешно открыт, функция возвращает указатель на объект файла, который используется для идентификации потока и выполнения операций с файлом. В противном случае, возвращается нулевой указатель.
Пример: исходный код программы
//пример использования функции fopen #include #include int main () < FILE * ptrFile = fopen(«file.txt», «w»); if (ptrFile != NULL) < fputs(«Пример использования функции fopen «, ptrFile); // записать строку в файл fclose (ptrFile); >return 0; >
Пример работы программы
Записать в только что открытый файл file.txt строку «Пример использования функции fopen» .
Источник: cppstudio.com
Ввод-вывод и работа с файлами
Файл в языке Си рассматривается как неструктурированная последовательность байтов. С этой точки зрения в языке программирования C файлом может быть как собственно файл на жестком диске, так и принтер, дисплей и другие подключаемые устройства ввода-вывода.
Как правило, взаимодействие между приложением и файлами производится посредством обмена блоков байт фиксированной длины (обычно длина представляет степень двойки — 256 или 512 байт).
При чтении из файла данные помещаются в буфер операционной системы, а затем побайтно передаются приложению.
При записи в файл данные накапливаются в буфере, а при заполнении буфера записываются на диск в виде единого блока байт.
Буферы представляют участки памяти, поэтому передача данных между приложением и буфером происходит довольно быстро в отличие от взаимодействия с физическими устройствами типа принтера.
Файл вместе с предоставляемыми средствами буферизации представляет поток .
Язык программирования Си содержит необходимый функционал для работы с файлами и устройствами ввода-вывода. Для применения его применения в программе необходимо подключить заголовочный файл stdio.h .
Открытие и закрытие потоков
Чтобы работать с потоком, его необходимо открыть. Для открытия потока применяется функция fopen() , которая имеет следующий прототип:
FILE * fopen(имя_файла, режим_открытия);
Первый параметр представляет имя открываемого файла, а второй задает режим открытия, от которого зависит, как файл может быть обработан.
Функция возвращает указатель на структуру, которая имеет тип FILE , определенный в том же файле stdio.h. Этот указатель идентифицирует поток в программе и через него мы сможем обращаться к открытому файлу.
При открытии поток связывается со структурой
Режимы открытия
Каждый режим задается в виде набора символов. В частности, мы можем использовать следующие режимы:
- «w» : текстовый файл открывается для записи. Если файл ранее существовал, то он пересоздается и записывается заново
- «r» : текстовый файл открывается для чтения
- «a» : текстовый файл открывается для добавления в него новых данных. Если файл существовал ранее, то данные просто добавляются
- «w+» : текстовый файл создается для записи/записи. Если файл ранее существовал, то при первой записи после открытия он пересоздается и записывается заново. А при последующих записях после открытия данные добавляются в него без перезаписи.
- «r+» : текстовый файл открывается для чтения/записи. Запись допустима в любом месте файла, кроме конца файла, то есть недопустимо увеличение размеров файла.
- «a+» : текстовый файл открывается или создается (при его отсутствии) для чтения/записи. В отличие от режима w+ файл при открытии не пересоздается заново, а в отличии от режима r+ можно записывать данные в конец файла
- «wb» : бинарный файл открывается для записи
- «rb» : бинарный файл открывается для чтения
- «ab» : бинарный файл открывается для дозаписи
- «w+b» : бинарный файл создается для записи/чтения
- «r+b» : бинарный файл открывается для чтения/записи
- «a+b» : бинарный файл открывается или создается (при его отсутствии) для чтения/дозаписи
Режимы позволяют разграничить доступ к файлу и открыть его только для чтения или только для записи или совместить оба варианта. Кроме того, на уровне режимов происходит разделение файлов на текстовые и бинарные. И программа будет обрабатывать файлы определенным образом, в зависимости какой режим будет выбран — для текстовых или бинарных файлов. Неправильно заданный режим может привести к некорректной интерпретации файла.
Закрытие файла
После завершения работы с файлом его следует закрыть. Для этого применяется функция fclose() :
int fclose(указатель_на_поток);
Единственный параметр функции представляет ранее полученный при открытии файла указатель на структуру FILE, связанный с файлом.
Функция возвращает число: 0 — в случае успешного выполнения и встроенное значение EOF в случае ошибки.
Например, откроем и закроем файл «data.txt», который расположен в одной и той же папке, что и выполняемая программа:
#include int main(void)
Если файл расположен в каком-то другом месте, то можно указать соответствующий относительный или абсолютный путь. Например, «С:\data.txt» (если файл data.txt расположен в корне диска C).
Обработка ошибок
В процессе открытия или создания файла мы можем столкнуться с рядом ошибок, например, при открытии в режиме чтения не окажется подобного файла, недостаточно памяти и т.д. И в случае возникновения ошибки функция fopen() возвращает значение NULL . Мы можем обработать возникновение ошибки с помощью проверки результата функции:
#include int main(void) < FILE * fp= fopen(«data28.txt», «r»); if(fp==NULL) < perror(«Error occured while opening data28.txt»); return 1; >fclose(fp); return 0; >
Для вывода ошибки на консоль применяется встроенная функция perror() . И так как дальнейшие действия в программе в случае ошибки при открытии файла смысла не имеют, то с помощью вызова return 1; завершаем работу приложения и возвращаем число, отличное от нуля (обычно ненулевое число рассматривается как код ошибки).
И если при попытке открытия файла по указанному пути его не окажется, то консоль выведет следующую ошибку:
Error occured while opening data28.txt: No such file or directory
Источник: metanit.com
#9 — Работа с файлами через язык Си
За счёт языка Си вы можете с легкостью манипулировать файлами и помещать в них различную информацию и позже считывать её. За урок мы научимся работать с файлами через язык Си.
Видеоурок
Многие языки программирования предоставляют классы для работы с файлами и директориями проекта. Язык Си обладает множеством возможностей для записи и чтения данных из файлов.
Работа с файлами
При работе с файлами всегда необходимо помнить две вещи:
- Перед началом работы с файлом его необходимо открыть;
- После завершения работы с файлом его необходимо закрыть.
Если файл не открыт или же неверно открыт, то вы не можете полноценно работать с его содержимым.
С закрытием все проще, но и коварнее. Если вы не закроете файл, то программа будет работать верно, тем не менее, чем больше будет открытых файлов, тем больше программа будет перегружена и в какой-то момент она просто зависнет или выключиться.
Запись данных в файл
При записи данных в файл его изначально необходимо открыть. Для этого в языке Си используется функция fopen :
// Создание/открытие файла «examples.txt» // Можно было использовать метод fopen FILE *file = fopen(«examples.txt», «w»); // Помещение данных fprintf(file, «Hello George»); // Закрываем файл fclose(file);
Таким образом мы можем открыть файл и поместить в него любую информацию.
Режим необходимо прописывать в качестве второго параметра при открытии файла:
Чтение данных из файла
Для чтения данных файл необходимо также изначально открыть и в конце закрыть. Чтобы прочесть содержимое файла используется функция fgets :
FILE *file = fopen(«test.txt», «r»); fgets(line, 255, file); printf(«%s», line); fclose(file);
Программа обучения
Также хотим отметить, что если вас интересует более углубленное изучение языка и его фреймворков, то предлагаем вашему внимаю наш полный курс по изучению C++ . За курс вы изучите язык C++, научитесь работать с библиотекой STL, базами данных, многопоточностью и научитесь строить приложения при помощи WinForms и QT.
Весь код будет доступен после подписки на проект!
Источник: itproger.com