Программирование на C и C++

Онлайн справочник программиста на C и C++

fread() и fwrite()

Файловая система ANSI С предоставляет две функции, позволяющие читать и писать блоки дан¬ных - fread() и fwrite(). Они имеют следующие прототипы:

size_t fread(void *буфер, size_t число_байту size_t объем, FILE *fp);

size_t fwrite(const void *буфер, size_t число_байт, size_t объем, FILE *fp);


В случае fread() буфер - это указатель на область памяти, которая получает данные из файла. В случае fwrite() буфер - это указатель на информацию, записываемую в файл. Длина каждого элемента в байтах определяется в число_байт. Аргумент объем определяет, сколько элементов (каж¬дый длиной число_байт) будет прочитано или записано. Наконец, fp - это файловый указатель на ранее открытый поток.

Функция fread() возвращает число прочитанных элементов. Данное значение может быть мень¬ше, чем объем, если был достигнут конец файла или произошла ошибка. Функция fwrite() возвра¬щает число записанных элементов. Данное значение равно объем, если не возникла ошибка.

Если файл был открыт для двоичных данных, то fread() и fwrite() могут читать и писать любой тип информации. Например, следующая программа записывает float в файл:

/* запись вещественных чисел в файл */
#include <stdio.h>
int main(void)
{
FILE *fp;
float f = 12.23;
if((fp=fopen("test", "wb"))==NULL) {
printf("Cannot open file.");
return 1;
}
fwrite(&f, sizeof (float), 1, fp);
fclose (fp);
return 0;
}

Как иллюстрирует данная программа, буфер может быть (а чаще всего это так и есть) простой переменной.

Одно из наиболее полезных применений fread() и fwrite() - это чтение и запись блоков данных типа массивов или структур. Например, следующий фрагмент записывает содержимое массива ве¬щественных чисел balance в файл balance, используя один оператор fwrite(). Далее она читает мас¬сив, используя один оператор fread(), и выводит его содержимое.

#include <stdio.h>
int main(void)
{
register int i;
FILE *fp;
float balance[100];

/* открытие на запись */
if((fp=fopen("balance", "wb"))==NULL) {
printf("Cannot open file.");
return 1;
}
for(i=0; i<100; i++) balance[i] = (float) i;

/* сохранение за раз всего массива balance */
fwrite(balance, sizeof balance, 1, fp) ;
fclose(fp);

/* обнуление массива */
for(i=0; i<100; i++) balance[i] = 0.0;

/* открытие для чтения */
if((fp=fopen("balance","rb"))==NULL) {
printf("cannot open file");
return 1;
}

/* чтение за раз всего массива balance */
fread(balance, sizeof balance, 1, fp);

/* вывод содержимого массива */
for(i=0; i<100; i++) printf("%f  ", balance [i]);
fclose(fp);
return 0;
}

Использование fread() и fwrite() для чтения или записи сложных данных более эффективно, чем использование повторяющихся вызовов getc() и putc().