Низкоуровневые функции ввода-вывода файлов позволяют наиболее непосредственно управлять чтением или записью данных в файл. Однако эти функции требуют, чтобы вы указывали более подробную информацию о файле, чем более простые в использовании функции высокого уровня. Полный список функций высокого уровня и поддерживаемых ими форматов файлов см. в Поддерживаемые Форматы файлов для Импорта и Экспорта.
Если функции высокого уровня не могут экспортировать ваши данные, используйте одно из следующего:
fprintf
, который записывает форматированные данные в текст или ASCII-файл; то есть файл, который можно просмотреть в текстовом редакторе или импортировать в электронную таблицу. Для получения дополнительной информации смотрите Экспорт в файлы текстовых данных с низкоуровневыми вводами-выводами.
fwrite
, который записывает поток двоичных данных в файл. Для получения дополнительной информации смотрите Запись двоичных данных в файл.
Примечание
Низкоуровневые функции ввода-вывода файлов основаны на функциях в 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);
fopen
| fread
| fseek
| fwrite