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

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

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

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

Примечание

Низкоуровневые функции ввода-вывода файлов основаны на функциях в 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® системы используют big-endian упорядоченное расположение байтов.

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

Например, чтобы создать файл с именем 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);

См. также

| | |

Похожие темы