АкушерствоАнатомияАнестезиологияВакцинопрофилактикаВалеологияВетеринарияГигиенаЗаболеванияИммунологияКардиологияНеврологияНефрологияОнкологияОториноларингологияОфтальмологияПаразитологияПедиатрияПервая помощьПсихиатрияПульмонологияРеанимацияРевматологияСтоматологияТерапияТоксикологияТравматологияУрологияФармакологияФармацевтикаФизиотерапияФтизиатрияХирургияЭндокринологияЭпидемиология

Fwrite( fid, A, 'precision' )

где fid - файловый идентификатор, возвращаемый функцией fopen; A - вектор или матрица, чьи элементы подлежат записи в файл; строка 'precision' говорит о размере памяти, отводимой под вещественные числа. Это 8 байт или 64 бита, так что строка должна иметь вид 'float64'.

В следующем фрагменте кода создаются вектор-столбец a и матрица B размером 2x3, которые затем записываются в файл с именем 'dataTest.gqw' ( здесь расширение имени файла выбрано произвольно так, чтобы не совпасть с известными расширениями ):

a = [ 1; 2; 3 ]; B = [ 4 5 6; 7 8 9 ];

fid1 = fopen( 'dataTest.gqw', 'wb' );

fwrite( fid1, a, 'float64' );

fwrite( fid1, B, 'float64' );

fclose( fid1 );

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

fid1 = fopen( 'dataTest.gqw', 'rb' );

[ 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 =

Последний из приведённых нами фрагментов кода страдает рядом практических недостатков, которые ярко высвечивают проблемы, с которыми приходится сталкиваться при работе с файлами ( особенно, бинарными ). Во-первых, мы лишь для краткости изложения не применяем проверку правильности открытия файла, о которой мы уже говорили выше.

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

Для отслеживания позиции файлового указателя и работы с ним служат функции feof ( служит для индикации конца файла ), fseek ( устанавливает файловый указатель ), ftell (позволяет узнать значение текущего файлового указателя), frewind ( устанавливает файловый указатель на началдо файла ). Все эти функции имеют прозрачный смысл, поэтому мы их подробно не будем рассматривать. О них всегда можно разузнать в справочной системе MATLABа.

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

Несмотря на только что сказанное, текстовые переменные MATLABа можно записывать и в бинарные файлы. Важно только учесть, что каждый символ требует двух байт, поэтому нужно использовать флаг 'int16'.

Вот пример такой работы:

str1 = 'Hello'; str2 = 'World!';

fid1 = fopen( 'strTest.gqw', 'wb' );

fwrite( fid1, str1, 'int16' );

fwrite( fid1, str2, 'int16' );

fclose( fid1 );

В результате будет создан файл strTest.gqw, содержащий в бинарном формате содержимое двух строковых переменных. Их можно прочесть с помощью функции fread:

fid1 = fopen( 'strTest.gqw', 'rb' );

[ 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!';

fid1 = fopen( 'strTest2.txt', 'w' );

fprintf( fid1, '%s\r\n%s\r\n', str1, str2 );

fclose( fid1 );

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

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

fid1 = fopen( 'strTest2.txt', 'r' );

str1 = fgetl( fid1 ); s

tr2 = fgetl( fid1 );

fclose( fid1 );

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

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


#$Глава 4.


Дата добавления: 2015-01-18 | Просмотры: 419 | Нарушение авторских прав



1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |



При использовании материала ссылка на сайт medlec.org обязательна! (0.018 сек.)