Какие бы действия с файлами мы ни совершали бы, необходимо выполнить четыре обязательных этапа:
Первый этап – определить указатель на файл.
Как уже говорилось, при чтении / записи информации в файл программа получает необходимую информацию из файловой структуры, доступ к которой обеспечивается с помощью указателя.
Файловая структура определена как тип данных – FILE в системном файле stdio.h.
Пример 10. Определение указателя на файл
#include <stdio.h>
FILE *file_pointer; //указатель на файл
После такого определения выделяется память под переменную с именем file_pointer. Если необходимо использовать одновременно несколько файлов, нужны указатели для каждого из них.
Например, если необходимо скопировать содержимое одного файла в другой, определяются два указателя на файл.
FILE *infile, *outfile;
Второй этап – открыть файл (функция fopen()).
На этом этапе устанавливается связь между именем файла и определенным ранее указателем на файл, также задается режим доступа к файлу. Режим доступа определяет, к какому файлу осуществляется доступ: к текстовому или двоичному, а также способ доступа – чтение или запись.
В общем виде функция fopen() выглядит следующим образом:
fp = fopen(“имя файла”, “режим доступа к файлу”);
Здесь fp – указатель на файл.
Ранее говорилось о возможности работы с двумя типами данных – текстовым и двоичным. О каких же данных идет речь в таблице 3?
Можно явно указать тип при открытии файла, для этого к обозначению режима доступа следует добавить:
b – для двоичного файла,
t - для текстового файла.
По умолчанию работа идет с текстовыми файлами.
Пример 11. Работа с двумя текстовыми и одним двоичным файлом.
fopen(“c:\\my_prog1.txt”, “r”); //текстовый файл – для чтения
fopen(“c:\\my_prog2.txt”, “w+”); //текстовый файл – чтение / запись
fopen(“c:\\my_prog3.txt”, “wb+”); //двоичный файл – чтение / запись
При ошибке доступа к внешнему устройству функция fopen() возвращает нулевой указатель. Ошибка может возникнуть, когда неверно указан путь к файлу, файл отсутствует на указанном внешнем устройстве или само устройство не готово к работе (неисправно или не включено).
Пример 12. Контроль ошибок при открытии файла
#include <stdio.h>
FILE *fp;
if (fp= fopen(“c:\\ prog.txt”, “r”) ==NULL)
{puts (“Otkrit’ file ne ydaloc’ \ n”);
// аварийное завершение программы
exit(1);
}
Третий этап – работа с данными файла (чтение / запись).
Применяются библиотечные функции для работы с данными текстового файла (все они описаны в файле stdio.h) – см. таблицу 4
Таблица 4
Потоковая функция или макрокоманда
Назначение
fopen
Открывает поток для чтения и (или) записи
fclose
Закрывает поток
fread
Читает блок данных из потока
getc, fgetc
Читает символ из потока
fgets
Читает строку текста из потока
fscanf
Читает форматированные данные из потока
fwrite
Записывает блок данных в поток
putc, fputc
Записывает символ в поток
fputc
Записывает строку текста в поток
fprintf
Записывает форматированные данные в поток
fseek
Перемещает указатель позиции в потоке
ftell
Возвращает текущую позицию в потоке. Возвращаемое значение – это смещение относительно начала потока (в байтах)
feof
Макрокоманда, которая возвращает ненулевое значение, если в данном потоке обнаружен символ конца файла, в противном случае – нулевое значение
ferror
Макрокоманда, возвращающая признак ошибки (0 – если ошибки не обнаружено, ненулевое значение в случае ошибки)
clearer
Макрокоманда, сбрасывающая флаг наличия ошибок в данном потоке
fileno
Макрокоманда, возвращающая дескриптор данного потокового файла
Четвертый этап – закрыть файл (функция fclose())
После окончания работы с файлом он должен быть закрыт.
Функция fclose() записывает все оставшиеся в буфере символы в файл, освобождает буфер и возвращает результат операции (нуль, если файл закрыт успешно, любое другое значение свидетельствует об ошибке).
Прототип функции
int fclose(FILE *fp);
Пример 13. Посимвольное чтений файла и вывод его на экран
#include <stdio.h>
void main()
{ FILE *in; //создаем указатель на файл
int ch;
//открываем Text для чтения, проверяя, существует ли он
if ((in = fopen(“Text”, “r”)!=NULL)
//указатель in ссылается на Text
{ while ((ch=getc(in)) != EOF) //получаем очередной символ
putc (ch, stdout); // вывод ch на экран (в стандартный поток вывода)
fclose (in); //закрываем файл
}
else printf(“File ne moget bit’ otkrit \n”)’
}.
Пример 14. Скопировать каждый пятый символ из файла Text в файл Text5
#include <stdio.h>
void main()
{char ch;
int count = 0; //счетчик символов
FILE *f_in, *f_out;
if ((in = fopen(“Text.txt”, “r”)!=NULL) //открыть файл для чтения
{f_out = fopen(“Text5.txt”, “w”); //открыть файл для записи
while ((ch=fgetc(f_in)) != EOF) //чтение символа из файла
if (count++ % 5 ==0)
fputc (ch, f_out); //запись символа в файл
fclose(f_in); //закрыть файлы
fclose(f_out);
}
else printf (“File ne otkrit! \n”); //обработка ошибки