
Запись и чтение бинарных файлов
Запись информации в бинарный файл осуществляется посредством функции fwrite, а чтение информации из бинарного файла — посредством функции fread:
fwrite(<идентификатор_файла>. A. 'precision')
Здесь А — числовой вектор (или матрица), элементы которого необходимо записать в файл, 'precision' — символьный параметр, указывающий, сколько памяти отводится под запись отдельного числа. В MATLAB для записи вещественных чисел, под которую отводится 8 байт (или 64 бита), используется тип doubl е. Поэтому при записи таких данных в бинарный файл нужно указать в качестве параметра 'precision' текстовую строку 'float64‘.
Следует заметить, что считывание значений элементов некоторой матрицы происходит по столбцам, то есть сначала считываются элементы первого столбца матрицы, затем — второго и т. д. В таком же порядке располагаются записываемые элементы в бинарном файле.
Рассмотрим пример записи значений элементов вектора х размером 1x5 и квадратной матрицы у размером 3x2.
» X = 1:5
» х = 1 2 3 4 5
» у = [6 7; 8 9; 10 11]
у = 6 7
9
10 11
в бинарный файл tst_dat.bin:
F1=fopen('tst_dat.bin'.'wb');
fwrite(Fl.x.'float64'); fwrite(Fl.y.'float64');
fclose(Fl);
Теперь осуществим чтение данных из записанного файла. Для этого откроем файл с флагом rb и применим функцию fread, предназначенную для чтения информации из бинарного файла. Обращение к ней осуществляется в такой форме:
[A.count] =freed(<идентификатор_файла>. [m.n].'precision')
Здесь А — имя числовой матрицы, элементы которой принимают считанные из файла значения, m — число строк этой матрицы, n — число ее столбцов, count — количество действительно считанных элементов из файла данных, 'precision' — символьный параметр, указывающий, сколько памяти отводится под запись в матрице А отдельного числа. Для записи в MATLAB данных из бинарного файла следует указать в качестве параметра 'precision' текстовую строку 'float64'. Параметр <идентификатор_файла> является символьной строкой, содержащей имя бинарного файла, из которого считывается информация.
При считывании информации из бинарного файла нужно иметь в виду следующие особенности:
считывание начинается с того места бинарного файла, где находится указатель;
при первом считывании только что открытого файла данных указатель расположен в самом начале бинарного файла, перед первым его элементом;
после очередного считывания с помощью функции fread указатель перемещается по файлу данных и устанавливается после последнего считанного элемента.
Приведем несколько примеров. В записанном нами файле tst_dat.bin содержится 11чисел типа double. Сначала считаем его в единственный вектор длиной 15 элементов:
» F2 » fopen('tst_dat.bin'.'rb');
» [Vl.cl] - fread(F2.[1.15],'float64')
» fclose(F2);
Получаем:
VI = 1 2 3 4 5 6 7 8 9 11 с1 = 11
Как видим, реально было считано 11 элементов. Порядок их расположения в записанном файле данных ясен из полученного вектора VI. Можно убедиться, что элементы исходной матрицы у были считаны при записи по столбцам.
Теперь считаем эти данные в вектор и в матрицу тех же размеров, которые были использованы при записи:
» F2 = fopen('tst_dat.bin'.'rb');
» [XI.с2] - fread(F2.[1.5].'float64')
» [Yl.c3] - fread(F2.[3.2].'float64’)
» fclose(F2);
XI = 1 2 3 4 5
c2 = 5
Y1 =
6 7
8 9
10 11
c3 = 6
Результат считывания полностью совпадает с исходными данными.
Наконец, попробуем считать матрицу у в матрицу Y2, имеющую заведомо большие размеры (4x3):
» F2 » fopen(’tst_dat.bin'.'rb');
» [Х2.с4] - fread(F2.[1.5].,float64')
» [Y2.c5] = fread(F2,[4.3].'float64')
» fclose(F2);
X2 = 1 2 3 4 5
c4 = 5
Y2 =
6 9
8 11
10 0
7 0
с5 = 6
Р
ПРИМЕЧАНИЕ! Правильное считывание данных из бинарного файла возможно только при условии, что заранее известно, в каком формате записаны данные в этот файл.
езультат показывает, что заполнение новых матриц, последовательно считываемыми элементами бинарного файла, осуществляется по столбцам. Недостающие элементы матриц заполняются нулями.Например, если считать данные в формате Float32, то получим следующее:
» F2 = fopen('tst_dat.bin',' rb');
» [Х2.С4] = fread(F2.[1.5],'float32')
» [Y2.c5] = fread(F2.[4.3]. 'f1oat32')
» fclose(F2);
X2 = 0 1.8750 0 2.0000 0
c4 = 5
Y2 =
c5 = 12
Такой результат ни в коей мере не отражает записанные исходные данные.