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