Читать «C++: базовый курс» онлайн - страница 344

Herbert Schildt

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 <stdio.h>

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 <stdio.h>

int main()

{

 register int i;

 FILE *fp;

 float balance[100];

 /* Открываем файл для записи. */

 if((fp=fopen("balance", "w"))==NULL) {

  printf("He удается открыть файл.\n");

  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", "r"))==NULL) {

  printf("He удается открыть файл.\n");

  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() для считывания и записи блоков данных более эффективно, чем многократно вызывать функции fgetc() и fputc().