Низкоуровневые функции ввода-вывода файлов позволяют осуществлять самый непосредственный контроль над чтением или записью данных в файл. Однако эти функции требуют указания более подробной информации о файле, чем упрощенные высокоуровневые функции. Полный список функций высокого уровня и поддерживаемых ими форматов файлов см. в разделе Поддерживаемые форматы файлов для импорта и экспорта.
Если функции высокого уровня не могут экспортировать данные, используйте одно из следующих действий.
fprintf, которая записывает форматированные данные в текстовый или ASCII-файл; то есть файл, который можно просмотреть в текстовом редакторе или импортировать в электронную таблицу. Дополнительные сведения см. в разделе Экспорт в текстовые файлы данных с низкоуровневым вводом/выводом.
fwrite, который записывает поток двоичных данных в файл. Дополнительные сведения см. в разделе Запись двоичных данных в файл.
Примечание
Низкоуровневые файловые функции ввода-вывода основаны на функциях библиотеки ANSI ® Standard 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);
Различные операционные системы по-разному хранят информацию на уровне байтов или битов:
Системы Big-endian хранят байты, начинающиеся с наибольшего адреса в памяти (то есть начинаются с большого конца).
Системы Little-endian хранят байты, начиная с наименьшего адреса (маленький конец).
Системы Windows ® используют порядок байтов little-endian, а системы UNIX ® - big-endian.
Чтобы создать файл для использования в противоположно-endian системе, укажите порядок байтов для целевой системы. Можно указать порядок в вызове для открытия файла или в вызове для записи файла.
Например, для создания файла с именем myfile.bin в системе big-endian для использования в системе little-endian используйте одну (или обе) из следующих команд:
Откройте файл с помощью
fid = fopen('myfile.bin', 'w', 'l')Запишите файл с помощью
fwrite(fid, mydata, precision, 'l')
где 'l' обозначает порядок little-endian.
Если вы не уверены, какой порядок байтов используется в вашей системе, вызовите computer функция:
[cinfo, maxsize, ordering] = computer
ordering является 'L' для систем little-endian или '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