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