Здесь переменная fp имеет тип FILE*. Однако зачастую для открытия файла используется такой код.
if((fp = fopen ("test", "w"))==NULL) {
printf ("Не удается открыть файл.");
exit(1);
}
При таком методе выявляется любая ошибка, связанная с открытием файла (например, при использовании защищенного от записи или заполненного диска), и только после этого можно предпринимать попытку записи в заданный файл. NULL — это макроимя, определенное в заголовке stdio.h.
Если вы используете функцию fopen(), чтобы открыть файл исключительно для выполнения операций вывода (записи), любой уже существующий файл с заданным именем будет стерт, и вместо него будет создан новый. Если файл с таким именем не существует, он будет создан. Если вам нужно добавлять данные в конец файла, используйте режим "a". Если окажется, что указанный файл не существует, он будет создан. Чтобы открыть файл для выполнения операций чтения, необходимо наличие этого файла. В противном случае функция возвратит значение ошибки. Наконец, если файл открывается для выполнения операций чтения-записи, то в случае его существования он не будет удален; но если его нет, он будет создан.
Функция fputc() Функция fputc() используется для вывода символов в поток, предварительно открытый для записи с помощью функции fopen(). Ее прототип имеет следующий вид.
int fputc(int ch, FILE *fp);
Здесь параметр fp — файловый указатель, возвращаемый функцией fopen(), а параметр ch — выводимый символ. Файловый указатель сообщает функции fputc(), в какой дисковый файл необходимо записать символ. Несмотря на то что параметр ch имеет тип int, в нем используется только младший байт.
При успешном выполнении операции вывода функция fputc() возвращает записанный в файл символ, в противном случае — значение EOF.
Функция fgetc() Функция fgetc() используется для считывания символов из потока, открытого в режиме чтения с помощью функции fopen(). Ее прототип имеет следующий вид.
int fgetc(FILE *fp);
Здесь параметр fp — файловый указатель, возвращаемый функцией fopen(). Несмотря на то что функция fgetс() возвращает значение типа int, его старший байт равен нулю.
При возникновении ошибки или достижении конца файла функция fgetc() возвращает значение EOF. Следовательно, для того, чтобы считать все содержимое текстового файла (до самого конца), можно использовать следующий код.
ch = fgetc(fp);
while(ch!=EOF) {
ch = fgetc(fp);
}
Функция feof() Файловая система в С может также обрабатывать двоичные данные. Если файл открыт в режиме ввода двоичных данных, то не исключено, что может быть считано целое число, равное значению EOF. В этом случае при использовании такого кода проверки достижения конца файла, как ch != EOF, будет создана ситуация, эквивалентная получению сигнала о достижении конца файла, хотя в действительности физический конец файла может быть еще не достигнут. Чтобы решить эту проблему, в языке С предусмотрена функция feof(), которая используется для определения факта достижения конца файла при считывании двоичных данных. Ее прототип имеет такой вид.
int feof(FILE *fp);
Здесь параметр fp идентифицирует файл. Функция feof() возвращает ненулевое значение, если конец файла был-таки достигнут; в противном случае — нуль. Таким образом, при выполнении следующей инструкции будет считано все содержимое двоичного файла.
while(!feof(fp)) ch = fgetc(fp);
Безусловно, этот метод применим и к текстовым файлам.
Функция fclose() Функция fclose() закрывает поток, который был открыт в результате обращения к функции fopen(). Она записывает в файл все данные, еще оставшиеся в дисковом буфере, и закрывает файл на уровне операционной системы. При вызове функции fclose() освобождается блок управления файлом, связанный с потоком, что делает его доступным для повторного использования. Вероятно, вам известно о существовании ограничения операционной системы на количество файлов, которые можно держать открытыми в любой момент времени, поэтому, прежде чем открывать следующий файл, рекомендуется закрыть все файлы, уже ненужные для работы.
Функция fclose() имеет следующий прототип,
int fclose(FILE *fp);
Здесь параметр fp — файловый указатель, возвращаемый функцией fopen(). При успешном выполнении функция fclose() возвращает нуль; в противном случае возвращается значение EOF. Попытка закрыть уже закрытый файл расценивается как ошибка. При удалении носителя данных до закрытия файла будет сгенерирована ошибка, как и в случае недостатка свободного пространства на диске.
Использование функций fopen(), fgetc(), fputc() и fclose()