Файловая система 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().