.: [предыдущая | оглавление | следующая] :.

11.4 Двоичные файлы

Открыть файл как двоичный (binary) означает, что из файла можно прочитать и записать любую информацию - числа, строки, битовые поля и т.д. Для того чтобы открыть файл как двоичный в функции fopen необходимо указать двоичную моду (суффикс b). Далее, используя, функции fwrite и fread производится запись и чтение данных. Ниже показан пример программы, которая открывает файл как двоичный на чтение и запись. Записывает в него размерность вектора вещественных чисел. Затем записывает сам вектор в файл. Далее указатель файла перемещается в начало файла и заново читается размерность вектора уже из файла. Затем выделяется память заданного размера, читается вектор в новый буфер, затем новый вектор печатается. После печати выделенная динамическая память возвращается, файл закрывается. Программа завершает свою работу.

В этом примере сочетается две операции, как правило, разделенных. Первая это создание двоичного файла. Вторая это чтение данных из файла. Структура файла - первые четыре байта хранят размерность массива. Затем хранятся сами элементы массива. При чтении массива из файла используется механизм распределения памяти. Первоначально читается размерность массива, затем распределяется память, производится чтение массива в динамический буфер.

Ниже приведен исходный текст программы.
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
int main(void)
{
      FILE *stream;
      int n=10;
      int m;
      double *z;
      double vec[10]= { 200.0, 100.9, 123.11, 321.33, 456.77, 777.0, 81.98, 990.45, 445.07, 0.009 };
      stream = fopen("Example2.bin", "w+b"); //открыть файл в двоичной моде
      fwrite(&n,sizeof(int) , 1, stream); //записать размерность
      fwrite(vec,sizeof(double)*10 , 1, stream); //записать
      fseek(stream, 0, SEEK_SET); //переместить указатель в начало файла
      fread(&m,sizeof(int) , 1, stream); //читать размерность
      z=(double*)malloc(sizeof(double)*m); //выделить память под массив
      fread(z,sizeof(double)*m , 1, stream); //читать массив чисел
      printf("%d \n",m);
      for(int i=0; i<m; i++) //печать массива
            printf("%3.3f ",z[i]);
      printf("\n"); //освободить память
      free(z);
      fclose(stream); //закрыть файл
      getch();
      return 0;
}
Упражнения
  1. Написать программу, сохраняющую в файл матрицу вещественных чисел переменной размерности.
  2. Написать программу чтения матрицы переменной размерности.
.: [предыдущая | оглавление | следующая] :.