
Открытие и закрытие файлов
Функции стандартного уровня, выполняющие файловый обмена, имеют прототипы, описанные в заголовочном файле stdio.h.
Работа
с файлом начинается с процедуры его
открытия. В этот момент операционная
система формирует в виде таблицы
служебную информацию о файле. В дальнейшем
по ссылке на эту таблицу операционная
система узнает, с каким файлом собирается
работать функция ввода-вывода.. Чтобы
этот механизм заработал, операционная
система присваивает таблице вместот
механизм заработалымации ввода-вывода,
эта ьпозволяет функция
файлам
Однако функции стандартного уровня для обращения к файлу требуют передать им более объемную информацию — указатель на дополнительно сформированную для файла структуру данных типа FILE (определена в заголовочном файле stdio.h.). Одним из полей этой структуры является дескриптор открытого файла. Кроме того, в структуре есть поля, описывающие состояние файла, информацию о буферизации и др. Обо всем этом программисту думать не нужно, так как структура типа FILE строится при выполнении функции, открывающей файл.
Файл может считываться или записываться посимвольно, поэтому существует понятие текущей позиции, откуда будет, например, считан очередной символ. С помощью структуры FILE поддерживается внутренний указатель чтения-записи, хранящий номер текущей позиции.
а) Открытие файла
Открытие файла на стандартном уровне осуществляется функцией fopen.
FILE* fopen(char* filename, char* mode);
filename — это литерал, содержащий имя файла (c полным или относительным, путем обратные слеши в записи путей должны удваиваться);
mode — указатель на литерал, задающий режим открытия файла.
"r"
— Файл открывается только для чтения.
Попытка записи приводит к ошибке. Если
файл с указанным именем не существует,
fopen
возвращает NULL.
При успешном открытии файла указатель
чтения-записи устанавливается в 0
(начало файла).
"w"
— Файл открывается только для записи
с усечением. Попытка чтения из файла
приводит к ошибке функции чтения. Если
файл с указанной спецификацией не
существует, он создается в указанной
директории. Если файл нельзя создать
или он имеет атрибут "только для
чтения" fopen
возвращает NULL.
При успешном открытии файла указатель
чтения-записи устанавливается в 0.
После закрытия файл имеет новый размер,
определяемый текущим положением
указателя чтения-записи. Открытие и
немедленное закрытие существующего
файла приводит к усечению его размера
до нулевой длины.
"a"
— Файл открывается для дополнения.
Отличие от "w"
заключается в том, что при успешном
открытии файла указатель чтения-записи
устанавливается в конец файла. Запись
в файл происходит с сохранением имевшейся
до этого информации.
"r+"
— Файл открывается для чтения и записи.
Если файл с указанной спецификацией
не существует, fopen
возвращает NULL.
При успешном открытии файла указатель
чтения-записи устанавливается в 0.
Если в момент закрытия файла указатель
чтения-записи находится левее положения
конца файла в момент его открытия,
усечения файла не происходит.
"w+"
— Файл открывается для чтения и записи.
Если файл с указанной спецификацией
не существует, он создается. При
успешном открытии файла указатель
чтения-записи устанавливается в 0.
"a+"
— Файл открывается для чтения и
дополнения. Если файл с указанной
спецификацией не существует, он
создается. При успешном открытии файла
в этом режиме указатель чтения-записи
устанавливается в конец файла.
По
умолчанию файл открывается для работы
в текстовом режиме (в Windows перевод строки
задается парой символов СR–LF,
а в Unix-подобных система только одним
LF),
но можно указать режим явно, записав в
строке mode
после r,
w,
a, r+,
w+,
a+
либо 'b'
(двоичный), либо 't'
(текстовый). Например "rt","a+b".
Режимы открытия файлов
В процессе своего выполнения функция fopen заполняет структурную переменную типа FILE, и возвращает указатель на нее.
Операция открытия файла является критической в том смысле, что может закончиться неудачей. В этом случае при попытке работать с файлом возникнет ошибка программы, и она дальше работать не сможет. Поэтому в обязательном порядке необходимо контролировать возвращаемое функцией fopen значение.
Пример
#include <stdio.h>
void main(){
FILE *fp;
fp=fopen("a:\\C\\USER\\file.c","r+");
if(fp == NULL) { puts(" Не удалось открыть файл!");exit(1);}
…}
б) Закрытие файла
После того, как операции с файлом закончены, нужно выполнить завершающие операции: выгрузить буфер обмена и освободить использованные для этого ресурсы. Эти действия называются закрытием файла.
Закрытие файла выполняет функция
int fclose(FILE *fp);
Функция закрывает файловый поток, который описывается указателем fp, полученный от fopen при открытии файла.
Функция fclose возвращает 0 в случае успешного закрытия. В противном случае (файл не был открыт или ошибка устройства) возвращает EOF.
При закрытии файла
— освобождается дескриптор файла, и память, занятая структурной переменной FILE и для буфера обмена;
— если выполнялась запись, то содержимое буфера обмена, в котором накапливалась выводимая информация, записывается в файл;
— обновляется элемент директории, соответствующий файлу (размер, время создания и т. д.).