Запись в файл matlab
Иллюстрированный самоучитель по MatLab
Операции с двоичными файлами
Двоичными, или бинарными, называют файлы, данные которых представляют собой машинные коды. Основные операции с такими кодами перечислены ниже.
- fopen(filename, permission) – открывает файл с именем filename и параметром, определенным в permission, и возвращает идентификатор fid со значением: 0 – чтение с клавиатуры (permission установлено в ‘r’); 1 – вывод на дисплей (permission установлено в ‘а’); 2 – вывод сообщения об ошибке (permission установлен в ‘ а’); – 1 – неудача в открытии файла с выводом сообщения message о типе ошибки. Идентификатор fid часто используется в качестве аргумента другими функциями и программами ввода-вывода. Имя файла filename может содержать путь к файлу.
Если открываемый для чтения файл не найден в текущем каталоге, то функция fopen осуществляет поиск файла по пути, указанном в MATLAB.
Параметр permission может принимать одно из следующих основных значений (другие см. в справочной системе):
- ‘r’ – открытие файла для чтения (по умолчанию);
- ‘r+’ – открытие файла для чтения и записи;
- ‘w’ – удаление содержимого существующего файла или создание нового и открытие его для записи;
- ‘а’ – создание и открытие нового файла или открытие существующего для записи с добавлением в конец файла.
Добавление к этой строке ‘ b’ (подразумевается по умолчанию) предписывает системе открыть файл в двоичном режиме.
Добавление же вместо b к этой строке ‘ t’, например ‘ rt’, в операционных системах, которые имеют различие между текстовыми и двоичными файлами, предписывает системе открыть файл в текстовом режиме. Например, во всех версиях MATLAB для Windows/MS-DOS и VMS нельзя открыть текстовый файл без параметра ‘ rt’. При вводе файлов с использованием fopen в текстовом режиме удаляются все символы «возврат каретки» перед символом новой строки.
- [f (компьютеры VAX и Cray) и т. д.
Определенные вызовы функций fread или fwrite могут отменить числовой формат, заданный при вызове функции fopen.
- f ) – возвращает вектор-строку, содержащую идентификаторы всех открытых файлов, не включая стандартные потоки О, 1 и 2. Число элементов вектора равно числу открытых пользователем файлов;
- [filename,permission,format] – fopen(fid) – возвращает полное имя файла, строку permission и строку format. При использовании недопустимых значений fid возвращаются пустые строки для всех выходных аргументов.
Команда fclose закрывает файл. Она имеет следующие варианты.
- status = fclose(f ) закрывает все открытые файлы. Возвращает 0 в случае успешного завершения и -1 – в противном случае.
Пример открытия и закрытия файла:
- [A,count] = fread(fid,size,precision) – считывает двоичные данные из заданного файла и помещает их в матрицу А. Выходной аргумент count содержит число удачно считанных элементов. Значение идентификатора fid – это целое число, возвращенное функцией fopen; size – аргумент, определяющий количество считываемых данных. Если аргумент size не определен, функция f read считывает данные до конца файла.
Используются следующие параметры size:
- n – чтение n элементов в вектор-столбец;
- inf – чтение элементов до конца файла и помещение их в вектор-столбец, содержащий такое же количество элементов, что и в файле;
- [m.n] – считывает столько элементов, сколько нужно для заполнения матрицы тхп.
Заполнение происходит по столбцам. Если элементов в файле мало, то матрица дополняется нулями. Если считывание достигает конца файла, не заполнив матрицу необходимого размера, то матрица дополняется нулями. Если происходит ошибка, чтение останавливается на последнем считанном значении. Параметр precision – строка, определяющая числовую точность считывания значений, она контролирует число считанных бит для каждого значения и интерпретирует эти биты как целое число, число с плавающей запятой или как символ.
Запись в файл matlab
10. Чтение и запись файлов данных.
Ранее были рассмотрены MAT-файлы, в которых сохраняются переменные из рабочей области системы MATLAB. Также были рассмотрены M-файлы, хранящие текст M-функций. Теперь рассмотрим файлы произвольного формата, в которых M-функции могут записывать, а затем читать собственные данные.
Под собственными данными мы последовательно рассмотрим запись содержимого числовых векторов и матриц, текстовых строк, структур и массивов ячеек.
Начнём с числовых векторов и матриц. Работать будем с так называемыми бинарными ( не текстовыми ) файлами, которые сначала надо открыть с помощью предназначенной для этого функцией fopen системы MATLAB:
f )
где имя файла может предваряться полным путём к нему ( иначе файл должен располагаться в текущем каталоге MATLABа ). Второй параметр этой функции — так называемый флаг открытия файла, говорит о способе дальнейшей работы с файлом:
‘rb’ — только для чтения
‘wb’ — только для записи ( предыдущее содержимое теряется )
Вторая буква в этих примерах говорит о бинарном характере файлов. Возможен ещё флаг, разрешающий как чтение, так и запись файлов одновременно ( ‘r+’ ), но мы его здесь использовать не будем.
Функция fopen возвращает числовой идентификатор открытого файла, который надо использовать в качестве параметра для функций чтения и записи в этот файл. Если операция открытия файла не удалась ( это возможно как по причине отсутствия файла, так и по причине неправильного указания пути к нему на диске ), то функция fopen возвращает -1.
Всегда следует проверять возврат функции fopen:
f );
if( f >
error( ‘File is not opened’ )
end
После того, как файл больше не требуется, его следует закрыть функцией fclose:
fclose( fid )
Чтение и запись информации в бинарные файлы осуществляется функциями fread и fwrite . Функция fwrite, предназначенная для записи информации в файлы, имеет следующие аргументы:
fwrite( fid, A, ‘precision’ )
где fid — файловый идентификатор, возвращаемый функцией fopen; A — вектор или матрица, чьи элементы подлежат записи в файл; строка ‘precision’ говорит о размере памяти, отводимой под вещественные числа. Это 8 байт или 64 бита, так что строка должна иметь вид ‘float64’.
В следующем фрагменте кода создаются вектор-столбец a и матрица B размером 2×3, которые затем записываются в файл с именем ‘dataTest.gqw’ ( здесь расширение имени файла выбрано произвольно так, чтобы не совпасть с известными расширениями ):
a = [ 1; 2; 3 ]; B = [ 4 5 6; 7 8 9 ];
f );
fwrite( fid1, a, ‘float64’ );
fwrite( fid1, B, ‘float64’ );
fclose( fid1 );
Теперь всегда, когда это потребуется, можно прочитать из файла сохранённые там значения вектора и матрицы. Что и иллюстрирует следующий фрагмент кода:
f );
[ a , count ] = fread( fid1, [1 3], ‘float64’ );
[ B , count ] = fread( fid1, [2 3], ‘float64’ );
fclose( fid1 );
Легко убедиться, что прочитанные значения совпадают с ранее записанными. При этом число count равно числу реально прочитанных вещественных чисел. При чтении вектора a это число будет равно 3, а при чтении матрицы B — будет равно 6.
B =
4 5 6
7 8 9
count =
6
Последний из приведённых нами фрагментов кода страдает рядом практических недостатков, которые ярко высвечивают проблемы, с которыми приходится сталкиваться при работе с файлами ( особенно, бинарными ). Во-первых, мы лишь для краткости изложения не применяем проверку правильности открытия файла, о которой мы уже говорили выше.
Во-вторых, при чтении какого-либо данного внутренний указатель текущей позиции ( подлежащей чтению ) файла продвигается на число прочитанных байт информации. В какой-то момент он может выйти на границу файла, и читать станет нечего. Такую ситуацию нужно отслеживать, чтобы не допускать ошибочных действий. Мы же в данном примере положились на наше хорошее знание устройства файла, поэтому мы вначале прочитали вектор, а затем — матрицу ( в другом порядке это делать нельзя ), указав при этом их правильные размеры.
Для отслеживания позиции файлового указателя и работы с ним служат функции feof ( служит для индикации конца файла ), fseek ( устанавливает файловый указатель ), ftell (позволяет узнать значение текущего файлового указателя), frewind ( устанавливает файловый указатель на началдо файла ). Все эти функции имеют прозрачный смысл, поэтому мы их подробно не будем рассматривать. О них всегда можно разузнать в справочной системе MATLABа.
Теперь поговорим немного о записи строк. Пока что мы работали с бинарными файлами. Другим типом файлов являются текстовые файлы. Они специально приспособлены для записи больших фрагментов текста, поскольку этим файлам органически присуще «понимание» деления текста на строки ( в самом что ни на есть книжном смысле этого слова ), а бинарные файлы этого «не понимают». Последние работают только с потоком байт.
Несмотря на только что сказанное, текстовые переменные MATLABа можно записывать и в бинарные файлы. Важно только учесть, что каждый символ требует двух байт, поэтому нужно использовать флаг ‘int16’.
Вот пример такой работы:
str1 = ‘Hello’; str2 = ‘World!’;
f );
fwrite( fid1, str1, ‘int16’ );
fwrite( fid1, str2, ‘int16’ );
fclose( fid1 );
В результате будет создан файл strTest.gqw, содержащий в бинарном формате содержимое двух строковых переменных. Их можно прочесть с помощью функции fread:
f );
[ a , count ] = fread( fid1, 5, ‘int16’ );
[ b , count ] = fread( fid1, 6, ‘int16’ );
str1 = char( a’ ); str2 = char( b’ );
fclose( fid1 );
К прочитанным из файла числовым вектор-столбцам a и b сначала применяется операция транспонирования для перевода их в вектор-строки, а затем осуществляется преобразование к типу char.
Для работы со строковыми данными больше подходят текстовые файлы. Их открывают с флагами ‘r’ или ‘w’ ( букву b, что означает binary — двоичный, теперь добавлять не надо ). Писать и читать строковые переменные в эти файлы удобно с помощью функций fprintf и fscanf. Вот пример записи в файл:
str1 = ‘Hello’; str2 = ‘World!’;
f );
fprintf( fid1, ‘%srn%srn’, str1, str2 );
fclose( fid1 );
Одним вызовом функции fprintf удаётся записать сразу две строковые ( символьные ) переменные str1 и str2. Информацию об этом нужно располагать во втором параметре функции fprint в виде символов формата %s, означающих запись строк. Каждый из этих символов нужно завершать парой специальных символов rn, означающих «возврат каретки и перевод строки». Таким образом, каждая из этих двух строк при чтении файла любым стандартным текстовым редактором ( например, редактором Notepad ) будет показана на отдельной строке:
Текстовые файлы, в отличие от бинарных, можно читать с меньшими предосторожностями и без лишней работы и детальных сведений о записанных значениях строковых переменных ( раньше мы, например, указывали длину строк ). Теперь, когда мы записали две строковые переменные с их разделением спецсимволами rn, мы может читать строки без указания их длины. Для этого следует воспользоваться функцией fgetl ( взять новую строку ):
f );
str1 = fgetl( fid1 ); s
tr2 = fgetl( fid1 );
fclose( fid1 );
Легко убедиться, что прочитанные значения совпадают с ранее записанными в этот текстовый файл:
Никаких специальных функций для записи и чтения в файлы структур и массивов ячеек MATLABа не существует. Поэтому их нужно записывать поэлементно с последующим поэлементным чтением и восстановлением их внутреннего устройства.
Запись в файл matlab
Недостатком рассмотренных функций save и load является то, что они работают с определенными форматами файлов (обычно mat-файлы) и не позволяют загружать или сохранять данные в других форматах. Между тем бывает необходимость загружать информацию, например, из бинарных файлов, созданных другими программными продуктами для дальнейшей обработки результатов в MatLab. С этой целью были разработаны функции
Здесь — это указатель на файл, с которым предполагается работать. Чтобы получить идентификатор, используется функция
где параметр может принимать значения, приведенные в табл. 5.1.
Таблица 5.1. Режимы работы с файлами в MatLab
Если функция fopen() по каким-либо причинам не может корректно открыть файл, то она возвращает значение -1. Ниже представлен фрагмент программы записи и считывания данных из бинарного файла:
f ); % открытие файла на запись
if f > error(‘File is not opened’);
end
fwrite(fid, A, ‘double’); % запись матрицы в файл (40 байт)
fclose(fid); % закрытие файла
f ); % открытие файла на чтение
if f > 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 существует функция для проверки достижения конца файла
которая возвращает 1 при достижении конца файла и 0 в других случаях. Перепишем программу для считывания произвольного числа элементов типа double из входного файла.
f ); % открытие файла на чтение
if f > 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 элементам, например, так
Следует также отметить, что функция fread() записана с двумя выходными параметрами V и N. Первый параметр содержит значение считанного элемента, а второй – число считанных элементов. В данном случае значение N будет равно 1 каждый раз при корректном считывании информации из файла, и 0 при считывании служебного символа EOF, означающий конец файла. Приведенная ниже проверка позволяет корректно сформировать вектор значений B.
С помощью функций fwrite() и fread() можно сохранять и строковые данные. Например, пусть дана строка
str = ‘Hello MatLab’;
которую требуется сохранить в файл. В этом случае функция fwrite() будет иметь следующую запись:
fwrite(fid, str, ‘int16’);
Здесь используется тип int16, т.к. при работе с русскими буквами система MatLab использует двухбайтовое представление каждого символа. Ниже представлена программа записи и чтения строковых данных, используя функции fwrite() и fread():
f );
if f > error(‘File is not opened’);
end
str=’Привет MatLab’; % строка для записи
fwrite(fid, str, ‘int16’); % запись в файл
fclose(fid);
f );
if f > 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);
Результат выполнения программы будет иметь вид
© 2020 Научная библиотека
Копирование информации со страницы разрешается только с указанием ссылки на данный сайт
Работа с файлами в среде MATLAB
Создание программ часто предполагает сохранение результатов расчетов в файлы для их дальнейшего анализа, обработки и хранения. В связи с этим в среде MATLAB реализованы различные функции по работе с файлами, содержащие данные в разных форматах.
Для загрузки данных из файла,расположенного на локальном диске в рабочую средуMATLAB, используются следующие операторы:load, freadиfscanf. Для сохранения данных из рабочей среды MATLAB в файл на локальном диске предусмотрено использование следующих операторов: save, fwrite, fprintf.
В самом простом случае для сохранения и последующей загрузки каких-либо данных в среде MATLAB предусмотрены следующие функции, соответственно: save и load, имеющие следующий синтаксис:
save
load
Функция save позволяет сохранять произвольные переменные, используемые в программе в файл, который будет по умолчанию располагаться в рабочем каталоге (обычно поддиректория work) и иметь расширение mat. Соответственно функция loadпозволяет загрузить из указанного mat-файла ранее сохраненные переменные.
Недостатком функций save и load является то, что они работают с определенными форматами файлов (обычно mat-файлы) и не позволяют загружать или сохранять данные в других форматах. Между тем бывает необходимость загружать информацию, например, из бинарных файлов, созданных другими программными продуктами для дальнейшей обработки результатов в среде MATLAB. С этой целью в среде MATLAB предусмотрены следующие функции
fwrite( , , )
=fread( , , )
где: – это указатель на файл, с которым предполагается работать. Для того, чтобы получить идентификатор файла, используется функция fopen, имеющая следующий синтаксис:
=fopen( , )
где: параметр может принимать значения, приведенные в таблице 1.
В том случае, если функция fopen() по каким-либо причинам не может корректно открыть файл, то она возвращает значение –1. После выполнения всех файловых операций файл должен быть закрыт с помощью функции fcloseследующей структуры:
fclose( )
С помощью команды fclose(all)можно закрыть сразу все открытые файлы, кроме стандартных системных файлов.
Пример использования функций работы с файлами:
A=[1 2 3 4 5];
f );% открытие файла на запись
fwrite(fid, A, ‘double’);% запись матрицы А в файл
fclose(fid);% закрытие файла
B=fread(fid, 5, ‘double’); % чтение 5 значений в формате double
disp(B); % отображение на экране
fclose(fid); % закрытие файла
В результате выполнения данных операций в рабочем каталоге MATLABбудет создан файл my_file.dat размером 40 байт, в котором будут содержаться 5 значений типа double, записанных в виде последовательности байт (по 8 байт на каждое значение). Функция fread() считывает последовательно сохраненные байты и автоматически преобразовывает их к типу double, т.е. каждые 8 байт интерпретируются как одно значение типа double.
В приведенном примере в явном виде указывалось число элементов для считывания из файла. Однако, часто общее количество элементов бывает неизвестным, либо изменяется в процессе работы программы. В этом случае необходимо считывать данные из файла до тех пор, пока не будет достигнут его конец. В MATLAB существует функция для проверки достижения конца файла,которая возвращает 1 при достижении конца файла и 0 в других случаях и имеет следующий синтаксис:
feof( )
Таблица 1 — Режимы работы с файлами в среде MATLAB при использовании функции fopen
Значение параметра | Описание параметра |
‘r’ | чтение |
‘w’ | запись (стирает предыдущее содержимое файла) |
‘a’ | добавление (создает файл, если его нет) |
‘r+’ | чтение и запись (не создает файл, если его нет) |
‘w+’ | чтение и запись (очищает прежнее содержимое или создает файл, если его нет) |
‘a+’ | чтение и добавление (создает файл, если его нет) |
‘b’ | дополнительный параметр, означающий работу с бинарными файлами, например, ‘wb’, ‘rb’ ‘rb+’, ‘ab’ |
Описанные ранее функции работы с файлами позволяют записывать и считывать информацию по байтам, которые затем требуется правильно интерпретировать для преобразования их в числа или строки. В то же время выходными результатами многих программ являются текстовые файлы, в которых явным образом записаны те или иные числа или текст. Прочитать такой файл побайтно, а затем интерпретировать полученные данные довольно трудоемкая задача, поэтому для этих целей были специально разработаны функции форматированного чтения или записи информации: fscanf и fprintf, соответственно.
Функция чтения fscanfимеет следующий синтаксис:
[value, count]=fscanf(fid, format, size)
где: value – результат считывания данных из файла; count – число прочитанных (записанных) данных; fid – указатель на файл; format – формат чтения (записи) данных; size – максимальное число считываемых данных
Функция записиfprintfимеет следующий синтаксис:
count=fprintf(fid, format, a,b. )
где:a,b,… – переменные для записи в файл.
Таблица 2- Список основных спецификаторов параметра formatдля функций fscanf() и fprintf()
Спецификатор | Описание |
%d | целочисленные значения |
%f | вещественные значения |
%s | строковые данные |
%c | символьные данные |
%u | беззнаковые целые значения |
В форматной строке могут бытьтакже использованы различные управляющие символы:
r – возврат каретки;
t – горизонтальная табуляция;
n – переход на новую строку
С помощью функции fprintf() можно осуществлять запись разнородных данных в файл в требуемом формате, в том числе и строковых переменных, что позволяет размещать в файле различные текстовые надписи.
Не нашли то, что искали? Воспользуйтесь поиском:
Лучшие изречения: Студент — человек, постоянно откладывающий неизбежность. 11311 — | 7592 —
или читать все.