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

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 | Просмотры: 544 | Нарушение авторских прав



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.004 сек.)