Выбрать главу

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()

Функции fopen(), fgetc(), fputc() и fclose() составляют минимальный набор операций с файлами. Их использование демонстрируется в следующей программе, которая выполняет копирование файла. Обратите внимание на то, что файлы открываются в двоичном режиме и что для проверки достижения конца файла используется функция feof().

/* Эта программа копирует содержимое одного файла в другой.

*/

#include <stdio.h>

int main(int argc, char *argv[])

{

 FILE *in, *out;

 char ch;

 if(argc!=3) {

  printf("Вы забыли ввести имя файла.\n");

  return 1;

 }

 if((in=fopen(argv[1], "rb")) == NULL) {

  printf("He удается открыть исходный файл.\n");

  return 1;

 }

 if((out=fopen(argv[2], "wb")) == NULL) {

  printf("He удается открыть файл-приемник.\n");

  return 1;

 }

 /* Код копирования содержимого файла. */

 while(!feof (in)) {

  ch = fgetc(in);

  if(!feof(in)) fputc (ch, out);

 }

 fclose(in);

 fclose(out);

 return 0;

}

Функции ferror() и rewind()

Функция ferror() используется для определения факта возникновения ошибки при выполнении операции с файлом. Ее прототип имеет такой вид.

int ferror(FILE *fp);

Здесь параметр fp — действительный файловый указатель. Функция ferror() возвращает значение true, если при выполнении последней файловой операции произошла ошибка; в противном случае — значение false. Поскольку возникновение ошибки возможно при выполнении любой операции с файлом, функцию ferror() необходимо вызывать сразу после каждой функции обработки файлов; в противном случае информацию об ошибке можно попросту потерять.