Функции fopen(), fgetc(), fputc() и fclose() составляют минимальный набор операций с файлами. Их использование демонстрируется в следующей программе, которая выполняет копирование файла. Обратите внимание на то, что файлы открываются в двоичном режиме и что для проверки достижения конца файла используется функция feof().
/* Эта программа копирует содержимое одного файла в другой.
*/
#include
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(). Их прототипы имеют следующий вид.
size_t fread(void *buffer, size_t num_bytes, size_t count, FILE *fp);
size_t fwrite(const void *buffer, size_t num_bytes, size_t count, FILE *fp);
При вызове функции fread() параметр buffer представляет собой указатель на область памяти, которая предназначена для приема данных, считываемых из файла. Функция считывает count объектов длиной num_bytes из потока, адресуемого файловым указателем fp. Функция fread() возвращает количество считанных объектов, которое может оказаться меньше заданного значения count, если при выполнении этой операции возникла ошибка или был достигнут конец файла.
При вызове функции fwrite() параметр buffer представляет собой указатель на информацию, которая подлежит записи в файл. Эта функция записывает count объектов длиной num_bytes в поток, адресуемый файловым указателем fp. Функция fwrite() возвращает количество записанных объектов, которое будет равно значению count, если при выполнении этой операции не было ошибки.
Если при вызове функций fread() и fwrite() файл был открыт для выполнения двоичной операции, то они могут считывать или записывать данные любого типа. Например, следующая программа записывает в дисковый файл значение типа float.
/* Запись в дисковый файл значения с плавающей точкой.
*/
#include
int main()
{
FILE *fp;
float f = 12.23F;
if((fp=fopen("test", "wb"))==NULL) {
printf("He удается открыть файл.\n");
return 1;
}
fwrite(&f, sizeof(float), 1, fp);
fclose(fp);
return 0;
}
Как показано в этой программе, роль буфера может выполнять (и при том довольно часто) одна переменная.
С помощью функций fread() и fwrite() часто выполняется считывание и запись содержимого массивов или структур. Например, следующая программа, используя одну только функцию fwrite(), записывает содержимое массива значений с плавающей точкой balance в файл с именем balance. Затем с помощью одной лишь функции fread() программа считывает элементы этого массива и отображает их на экране.
#include
int main()
{
register int i;