<< ПредыдущаяОглавлениеСледующая >>


5.2. Функции fwrite и fread

Недостатком рассмотренных функций save и load является то, что они работают с определенными форматами файлов (обычно mat-файлы) и не позволяют загружать или сохранять данные в других форматах. Между тем бывает необходимость загружать информацию, например, из бинарных файлов, созданных другими программными продуктами для дальнейшей обработки результатов в MatLab. С этой целью были разработаны функции

fwrite(<идентификатор файла>, <переменная>, <тип данных>);

и

<переменная>=fread(<идентификатор файла>);
<переменная>=fread(<идентификатор файла>, <размер>);
<переменная>=fread(<идентификатор файла>, <размер>, <точность>);

Здесь <идентификатор файла> - это указатель на файл, с которым предполагается работать. Чтобы получить идентификатор, используется функция

<идентификатор файла> = fopen(<имя файла>,<режим работы>);

где параметр <режим работы> может принимать значения, приведенные в табл. 5.1.

Таблица 5.1. Режимы работы с файлами в MatLab

параметр <режим работы>

описание

'r'

чтение

'w'

запись (стирает предыдущее содержимое файла)

'a'

добавление (создает файл, если его нет)

'r+'

чтение и запись (не создает файл, если его нет)

'w+'

чтение и запись (очищает прежнее содержимое или создает файл, если его нет)

'a+'

чтение и добавление (создает файл, если его нет)

'b'

дополнительный параметр, означающий работу с бинарными файлами, например, ‘wb’, ‘rb’ ‘rb+’, ‘ab’ и т.п.

Если функция fopen() по каким-либо причинам не может корректно открыть файл, то она возвращает значение -1. Ниже представлен фрагмент программы записи и считывания данных из бинарного файла:

A = [1 2 3 4 5];
 
fid = fopen('my_file.dat', 'wb');     % открытие файла на запись
if fid == -1                     % проверка корректности открытия
    error('File is not opened');
end
 
fwrite(fid, A, 'double');   % запись матрицы в файл (40 байт)
fclose(fid);                % закрытие файла
 
fid = fopen('my_file.dat', 'rb');     % открытие файла на чтение
if fid == -1                     % проверка корректности открытия
    error('File is not opened');
end
 
B = fread(fid, 5, 'double');     % чтение 5 значений double
disp(B);                         % отображение на экране
fclose(fid);                     % закрытие файла

В результате работы данной программы в рабочем каталоге будет создан файл my_file.dat размером 40 байт, в котором будут содержаться 5 значений типа double, записанных в виде последовательности байт (по 8 байт на каждое значение). Функция fread() считывает последовательно сохраненные байты и автоматически преобразовывает их к типу double, т.е. каждые 8 байт интерпретируются как одно значение типа double.

В приведенном примере явно указывалось число элементов (пять) для считывания из файла. Однако часто общее количество элементов бывает наперед неизвестным, либо оно меняется в процессе работы программы. В этом случае было бы лучше считывать данные из файла до тех пор, пока не будет достигнут его конец. В MatLab существует функция для проверки достижения конца файла

feof(<идентификатор файла>)

которая возвращает 1 при достижении конца файла и 0 в других случаях. Перепишем программу для считывания произвольного числа элементов типа double из входного файла.

fid = fopen('my_file.dat', 'rb');  % открытие файла на чтение
if fid == -1
    error('File is not opened');
end
 
B=0;                % инициализация переменной
cnt=1;              % инициализация счетчика
while ~feof(fid)    % цикл, пока не достигнут конец файла
    [V,N] = fread(fid, 1, 'double');  %считывание одного
% значения double (V содержит значение
% элемента, N – число считанных элементов)
    if N > 0        % если элемент был прочитан успешно, то
        B(cnt)=V;   % формируем вектор-строку из значений V
        cnt=cnt+1;  % увеличиваем счетчик на 1
    end
end
disp(B);            % отображение результата на экран
fclose(fid);        % закрытие файла

В данной программе динамически формируется вектор-строка по мере считывания элементов из входного файла. MatLab автоматически увеличивает размерность векторов, если индекс следующего элемента на 1 больше максимального. Однако на такую процедуру тратится много машинного времени и программа начинает работать заметно медленнее, чем если бы размерность вектора B с самого начала была определена равным 5 элементам, например, так

B = zeros(5,1);

Следует также отметить, что функция fread() записана с двумя выходными параметрами V и N. Первый параметр содержит значение считанного элемента, а второй – число считанных элементов. В данном случае значение N будет равно 1 каждый раз при корректном считывании информации из файла, и 0 при считывании служебного символа EOF, означающий конец файла. Приведенная ниже проверка позволяет корректно сформировать вектор значений B.

С помощью функций fwrite() и fread() можно сохранять и строковые данные. Например, пусть дана строка

str = 'Hello MatLab';

которую требуется сохранить в файл. В этом случае функция fwrite() будет иметь следующую запись:

fwrite(fid, str, 'int16');

Здесь используется тип int16, т.к. при работе с русскими буквами система MatLab использует двухбайтовое представление каждого символа. Ниже представлена программа записи и чтения строковых данных, используя функции fwrite() и fread():

fid = fopen('my_file.dat', 'wb');
if fid == -1
    error('File is not opened');
end
 
str='Привет MatLab';                   % строка для записи
fwrite(fid, str, 'int16');        % запись в файл
fclose(fid);
 
fid = fopen('my_file.dat', 'rb');
if fid == -1
    error('File is not opened');
end
 
B='';                             % инициализация строки
cnt=1;
while ~feof(fid)
    [V,N] = fread(fid, 1, 'int16=>char');  % чтение текущего
% символа и преобразование
% его в тип char
    if N > 0
        B(cnt)=V;
        cnt=cnt+1;
    end
end
disp(B);                     % отображение строки на экране
fclose(fid);

Результат выполнения программы будет иметь вид

Привет MatLab



<< ПредыдущаяОглавлениеСледующая >>