exponenta event banner

Экспорт двоичных данных с низким уровнем ввода-вывода

Низкоуровневые функции экспорта данных

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

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

Примечание

Низкоуровневые файловые функции ввода-вывода основаны на функциях библиотеки ANSI ® Standard C. Однако MATLAB ® включает векторизованные версии функций для чтения и записи данных в массив с минимальными циклами управления.

Запись двоичных данных в файл

В этом примере показано, как использовать fwrite для экспорта потока двоичных данных в файл.

Создание файла с именем nine.bin с целыми числами от 1 до 9. Как и для любой из низкоуровневых функций ввода-вывода, перед записью откройте или создайте файл с помощью fopen и получают идентификатор файла.

fileID = fopen('nine.bin','w');
fwrite(fileID, [1:9]);

По умолчанию fwrite записывает значения из массива в порядке столбцов как 8-битные беззнаковые целые числа (uint8).

Завершив обработку файла, закройте его с помощью fclose.

fclose(fileID);

Создайте файл со значениями двойной точности. Необходимо указать точность значений, если значения в матрице не являются 8-битными беззнаковыми целыми числами.

mydata = [pi 42 1/3];

fileID = fopen('double.bin','w');
fwrite(fileID,mydata,'double');
fclose(fileID);

Перезаписать или добавить в существующий двоичный файл

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

По умолчанию fopen открывает файлы с доступом для чтения. Чтобы изменить тип доступа к файлу, используйте спецификатор разрешений в вызове fopen. Возможные спецификаторы разрешений:

  • 'r' для чтения

  • 'w' для записи, отбрасывания любого существующего содержимого файла

  • 'a' для добавления в конец существующего файла

Чтобы открыть файл как для чтения, так и для записи или добавления, приложите к разрешению знак «плюс», например 'w+' или 'a+'. При открытии файла для чтения и записи необходимо вызвать fseek или frewind между операциями чтения и записи.

Перезаписать часть существующего файла

Создание файла с именем magic4.bin, указывая разрешение на запись и чтение.

fileID = fopen('magic4.bin','w+');
fwrite(fileID,magic(4));

Исходная матрица магии (4):

16 2 3 13

5 11 10 8

9 7 6 12

4 14 15 1

Файл содержит 16 байт, по 1 для каждого значения в матрице.

Замените значения во втором столбце матрицы вектором, [44 44 44 44]. Для этого сначала ищите четвертый байт от начала файла с помощью fseek.

fseek(fileID,4,'bof');

Запишите вектор [44 44 44 44] использование fwrite.

fwrite(fileID,[44 44 44 44]);

Считывайте результаты из файла в матрицу 4 на 4.

frewind(fileID);
newdata = fread(fileID,[4,4])
newdata = 4×4

    16    44     3    13
     5    44    10     8
     9    44     6    12
     4    44    15     1

Закройте файл.

fclose(fileID);

Добавить двоичные данные в существующий файл

Добавление значений [55 55 55 55] кому magic4.bin. Сначала. откройте файл с разрешением на добавление и чтение.

fileID = fopen('magic4.bin','a+');

Запишите значения в конце файла.

fwrite(fileID,[55 55 55 55]);

Считывайте результаты из файла в матрицу 4 на 5.

frewind(fileID);
appended = fread(fileID, [4,5])
appended = 4×5

    16    44     3    13    55
     5    44    10     8    55
     9    44     6    12    55
     4    44    15     1    55

Закройте файл.

fclose(fileID);

Создание файла для использования в другой системе

Различные операционные системы по-разному хранят информацию на уровне байтов или битов:

  • Системы Big-endian хранят байты, начинающиеся с наибольшего адреса в памяти (то есть начинаются с большого конца).

  • Системы Little-endian хранят байты, начиная с наименьшего адреса (маленький конец).

Системы Windows ® используют порядок байтов little-endian, а системы UNIX ® - big-endian.

Чтобы создать файл для использования в противоположно-endian системе, укажите порядок байтов для целевой системы. Можно указать порядок в вызове для открытия файла или в вызове для записи файла.

Например, для создания файла с именем myfile.bin в системе big-endian для использования в системе little-endian используйте одну (или обе) из следующих команд:

  • Откройте файл с помощью

    fid = fopen('myfile.bin', 'w', 'l')
  • Запишите файл с помощью

    fwrite(fid, mydata, precision, 'l')

где 'l' обозначает порядок little-endian.

Если вы не уверены, какой порядок байтов используется в вашей системе, вызовите computer функция:

[cinfo, maxsize, ordering] = computer
Возвращенный ordering является 'L' для систем little-endian или 'B' для биг-эндиевых систем.

Запись и чтение комплексных чисел

В этом примере показано, как записывать и читать комплексные числа в двоичных файлах.

Доступные значения точности для fwrite не поддерживают явно комплексные числа. Чтобы сохранить комплексные числа в файле, разделите вещественные и мнимые компоненты и запишите их отдельно в файл. Это можно сделать двумя способами:

  • Записать все реальные компоненты, за которыми следуют все мнимые компоненты

  • Перемежение компонентов

Используйте подход, позволяющий считывать данные в целевом приложении.

Разделение вещественных и мнимых компонентов

Создайте массив, содержащий сложные значения.

nrows = 5;
ncols = 5;
z = complex(rand(nrows, ncols), rand(nrows, ncols))
z = 5×5 complex

   0.8147 + 0.7577i   0.0975 + 0.7060i   0.1576 + 0.8235i   0.1419 + 0.4387i   0.6557 + 0.4898i
   0.9058 + 0.7431i   0.2785 + 0.0318i   0.9706 + 0.6948i   0.4218 + 0.3816i   0.0357 + 0.4456i
   0.1270 + 0.3922i   0.5469 + 0.2769i   0.9572 + 0.3171i   0.9157 + 0.7655i   0.8491 + 0.6463i
   0.9134 + 0.6555i   0.9575 + 0.0462i   0.4854 + 0.9502i   0.7922 + 0.7952i   0.9340 + 0.7094i
   0.6324 + 0.1712i   0.9649 + 0.0971i   0.8003 + 0.0344i   0.9595 + 0.1869i   0.6787 + 0.7547i

Разделите комплексные значения на вещественные и мнимые компоненты.

z_real = real(z);
z_imag = imag(z);

Записать все реальные компоненты, за которыми следуют воображаемые компоненты

Запишите все реальные компоненты, z_real, за которыми следуют все мнимые компоненты, z_imag, в файл с именем complex_adj.bin.

adjacent = [z_real z_imag];

fileID = fopen('complex_adj.bin', 'w');
fwrite(fileID,adjacent,'double');
fclose(fileID);

Считывание значений из файла с помощью fread.

fileID = fopen('complex_adj.bin');
same_real = fread(fileID, [nrows, ncols], 'double');
same_imag = fread(fileID, [nrows, ncols], 'double');
fclose(fileID);

same_z = complex(same_real, same_imag);

Перемежать вещественные и мнимые компоненты

Альтернативный подход заключается в перемежении вещественных и мнимых компонентов для каждого значения. fwrite записывает значения в порядке столбцов, поэтому создает массив, объединяющий действительную и мнимую части чередованием строк.

Сначала предварительно распределите чередующийся массив.

interleaved = zeros(nrows*2, ncols);

Альтернативные реальные и мнимые данные.

newrow = 1;
for row = 1:nrows
    interleaved(newrow,:) = z_real(row,:);
    interleaved(newrow + 1,:) = z_imag(row,:);
    newrow = newrow + 2;
end

Запишите перемеженные значения в файл с именем complex_int.bin.

fileID = fopen('complex_int.bin','w');
fwrite(fileID, interleaved, 'double');
fclose(fileID);

Откройте файл для чтения и прочтите реальные значения из файла. Четвертый вход в fread указывает функции пропустить указанное количество байт после считывания каждого значения.

fileID = fopen('complex_int.bin');
same_real = fread(fileID, [nrows, ncols], 'double', 8);

Вернитесь к первому мнимому значению в файле. Затем прочтите все мнимые данные.

fseek(fileID, 8, 'bof');
same_imag = fread(fileID, [nrows, ncols], 'double', 8);
fclose(fileID);

same_z = complex(same_real, same_imag);

См. также

| | |

Связанные темы