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, ‘%s
%s
‘, str1, str2 );

fclose( fid1 );

Одним вызовом функции fprintf удаётся записать сразу две строковые ( символьные ) переменные str1 и str2. Информацию об этом нужно располагать во втором параметре функции fprint в виде символов формата %s, означающих запись строк. Каждый из этих символов нужно завершать парой специальных символов
, означающих "возврат каретки и перевод строки". Таким образом, каждая из этих двух строк при чтении файла любым стандартным текстовым редактором ( например, редактором Notepad ) будет показана на отдельной строке:

Текстовые файлы, в отличие от бинарных, можно читать с меньшими предосторожностями и без лишней работы и детальных сведений о записанных значениях строковых переменных ( раньше мы, например, указывали длину строк ). Теперь, когда мы записали две строковые переменные с их разделением спецсимволами
, мы может читать строки без указания их длины. Для этого следует воспользоваться функцией fgetl ( взять новую строку ):

f );

str1 = fgetl( fid1 ); s

tr2 = fgetl( fid1 );

fclose( fid1 );

Легко убедиться, что прочитанные значения совпадают с ранее записанными в этот текстовый файл:

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

Я столкнулся с многочисленными способами записи данных Matlab в.txt файл, но я не уверен, какой способ лучше всего подходит для моих нужд. У меня есть два набора данных с метками "x" и "y", в пределах которых данные просто бегут вниз 1 столбец (A1. An), и мне нужен файл с разделителями с разделителями табуляции, сделанный в формате:

В результате я могу иметь 2 одинаковых столбца данных X, за которыми следуют данные Y. Я также должен иметь возможность вводить что-то для столбца "Имя", которое будет копировать себя до тех пор, пока данные в X/Y не остановятся. Мне не нужны заголовки столбцов, т.е. "X" "Y" или "Имя" только сами данные.

Какой был бы лучший способ сделать это?

Запустите этот пример кода, и вы можете проверить, что он делает то, что вы хотите:

Открывая текстовый файл, вы увидите что-то вроде:

Если вы хотите, чтобы значение для строки "Тест" изменялось в каждой строке, просто передайте массив с этими строковыми значениями, подобно тому, как переменные x и y передаются в оператор fprintf().

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

В форматной строке могут бытьтакже использованы различные управляющие символы:


– возврат каретки;

– горизонтальная табуляция;


– переход на новую строку

С помощью функции fprintf() можно осуществлять запись разнородных данных в файл в требуемом формате, в том числе и строковых переменных, что позволяет размещать в файле различные текстовые надписи.

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Только сон приблежает студента к концу лекции. А чужой храп его отдаляет. 8833 — | 7549 — или читать все.

78.85.5.224 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно