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

Низкоуровневые функции для того, чтобы экспортировать данные

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

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

Примечание

Низкоуровневые функции ввода-вывода файлов основаны на функциях в ANSI® Стандартная библиотека для 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);

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

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

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

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

Windows® системы используют порядок байтов с прямым порядком байтов и UNIX® системы используют порядок байтов с обратным порядком байтов.

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

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

  • Откройте файл с

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

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

где 'l' указывает на упорядоченное расположение с прямым порядком байтов.

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

[cinfo, maxsize, ordering] = computer
Возвращенный ordering 'L' для систем с прямым порядком байтов или '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);

Смотрите также

| | |

Похожие темы