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

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

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

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

Примечание

Низкоуровневые функции ввода-вывода файлов основаны на функциях в библиотеке ANSI® Standard C Library. Однако<sup class="" contenteditable="">However, MATLAB®</sup>&nbsp; включает векторизованные версии функций для чтения и записи данных в массив с минимальными циклами управления.

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

Этот пример показывает, как использовать функцию 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' для систем с обратным порядком байтов.

Открытые файлы с различными кодировками символов

Схемы кодирования поддерживают символы, требуемые для конкретных алфавитов, таких как те для японского или европейских языков. Общие схемы кодирования включают US-ASCII или UTF-8.

Схема кодирования определяет количество байтов, требуемых считать или записать значения char. Например, символы US-ASCII всегда используют 1 байт, но символы UTF-8 используют до 4 байтов. MATLAB автоматически обрабатывает необходимое количество байтов для каждого значения char на основе заданной схемы кодирования. Однако, если вы задаете точность uchar, процессы MATLAB каждый байт как uint8, независимо от заданного кодирования.

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

[filename, permission, machineformat, encoding] = fopen(fid);

Если вы задаете схему кодирования, когда вы открываете файл, следующие функции применяют ту схему: fscanf, fprintf, fgetl, fgets, fread и fwrite.

Для полного списка поддерживаемых схем кодирования и синтаксиса для определения кодирования, смотрите страницу с описанием fopen.

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

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

Доступные значения точности для 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);

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

| | |

Похожие темы