Читать «C++: базовый курс» онлайн - страница 343

Herbert Schildt

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() необходимо вызывать сразу после каждой функции обработки файлов; в противном случае информацию об ошибке можно попросту потерять.

Функция rewind() перемещает индикатор позиции файла в начало файла, заданного в качестве аргумента. Ее прототип выглядит так.

void rewind(FILE *fp);

Здесь параметр fp — действительный файловый указатель.

Функции fread() и fwrite()

В файловой системе языка С предусмотрено две функции, fread() и fwrite(), которые позволяют считывать и записывать блоки данных. Эти функции подобны С++-функциям read() и write(). Их прототипы имеют следующий вид.