Читать «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(). Их прототипы имеют следующий вид.