Низкоуровневые функции ввода-вывода файлов позволяют осуществлять самый прямой контроль над чтением или записью данных в файл. Однако эти функции требуют, чтобы вы указали более подробную информацию о своем файле, чем более простые в использовании высокоуровневые функции. Полный список функций высокого уровня и поддерживаемых ими форматов файлов см. в Поддерживаемые Форматы файлов для Импорта и Экспорта.
Если высокоуровневые функции не могут импортировать ваши данные, используйте одно из следующего:
fscanf
, который читает отформатированные данные в тексте или ASCII-файле; то есть, файл можно просмотреть в текстовом редакторе. Для получения дополнительной информации смотрите Данные о Чтении в Отформатированном Шаблоне.
fgetl
и fgets
, которые читают одну строку файла за один раз, где символ новой строки разделяет каждую линию. Для получения дополнительной информации см. Построчное чтение данных.
fread
, который считывает поток данных на байтовом или битовом уровне. Для получения дополнительной информации смотрите Двоичные данные Чтения в Файле.
Примечание
Низкоуровневые функции ввода-вывода файлов основаны на функциях в ANSI® Стандартная библиотека для C. Однако MATLAB® включает векторизованные версии функций, чтобы читать и записать данные в массиве с минимальными циклами управления.
Как с любой из низкоуровневых функций ввода-вывода, перед импортом, открывают файл с fopen
, и получите идентификатор файла. Когда вы закончили обрабатывать файл, закрываете его с fclose
(
.fileID
)
По умолчанию, fread
читает файл 1 байт за один раз и интерпретирует каждый байт как 8-битное беззнаковое целое (uint8
). fread
создает вектор-столбец, с одним элементом для каждого байта в файле. Значения в вектор-столбце имеют класс double
.
Например, считайте файл nine.bin
, созданный можно следующим образом:
fid = fopen('nine.bin','w'); fwrite(fid, [1:9]); fclose(fid);
Считывать все данные в файле в 9 1 вектор-столбец класса double
:
fid = fopen('nine.bin'); col9 = fread(fid); fclose(fid);
По умолчанию, fread
чтения все значения в файле в вектор-столбец. Однако можно задать количество значений, чтобы считать, или описать двумерную выходную матрицу.
Например, чтобы считать nine.bin
, описанный в предыдущем примере:
fid = fopen('nine.bin'); % Read only the first six values col6 = fread(fid, 6); % Return to the beginning of the file frewind(fid); % Read first four values into a 2-by-2 matrix frewind(fid); two_dim4 = fread(fid, [2, 2]); % Read into a matrix with 3 rows and % unspecified number of columns frewind(fid); two_dim9 = fread(fid, [3, inf]); % Close the file fclose(fid);
Если значения в вашем файле не являются 8-битным беззнаковым целым, задают размер значений.
Например, считайте файл fpoint.bin
, созданный со значениями с двойной точностью можно следующим образом:
myvals = [pi, 42, 1/3]; fid = fopen('fpoint.bin','w'); fwrite(fid, myvals, 'double'); fclose(fid);
Считать файл:
fid = fopen('fpoint.bin'); % read, and transpose so samevals = myvals samevals = fread(fid, 'double')'; fclose(fid);
Для полного списка описаний точности смотрите fread
страница ссылки на функцию.
По умолчанию, fread
создает массив класса double
. Хранение значений с двойной точностью в массиве требует большей памяти, чем хранение символов, целых чисел или значений с одинарной точностью.
Чтобы уменьшать объем памяти, требуемый хранить ваши данные, задайте класс массива с помощью одного из следующих методов:
Совпадайте с классом входных значений со звездочкой ('*'
). Например, чтобы считать значения с одинарной точностью в массив класса single
, используйте команду:
mydata = fread(fid,'*single')
Сопоставьте входные значения с новым классом с '=>'
символ. Например, чтобы считать uint8
значения в uint16
массив, используйте команду:
mydata = fread(fid,'uint8=>uint16')
Для полного списка описаний точности смотрите fread
страница ссылки на функцию.
Низкоуровневые функции MATLAB включают несколько опций для чтения фрагментов двоичных данных в файле:
Считайте конкретное количество значений за один раз, как описано в Изменении Размерностей Массива. Рассмотрите объединение этого метода с Тестированием на Конец Файла.
Переместитесь в определенное местоположение в файле, чтобы начать читать. Для получения дополнительной информации смотрите Перемещение в Файле.
Пропустите определенное число байтов или битов после каждого чтения элемента. Для примера смотрите Комплексные числа Записи и Чтения.
Когда вы открываете файл, MATLAB создает указатель, чтобы указать на текущее положение в файле.
Примечание
Открытие пустого файла не перемещает индикатор позиции в файле в конец файла. Операции чтения и fseek
и frewind
функции, переместите индикатор позиции в файле.
Используйте feof
функционируйте, чтобы проверять, достигли ли вы конца файла. feof
возвращает значение 1
когда указатель файла в конце файла. В противном случае это возвращает 0
.
Например, считайте большой файл в частях:
filename = 'largedata.dat'; % hypothetical file segsize = 10000; fid = fopen(filename); while ~feof(fid) currData = fread(fid, segsize); if ~isempty(currData) disp('Current Data:'); disp(currData); end end fclose(fid);
Чтобы считать или записать выбранные фрагменты данных, переместите индикатор позиции в файле в любое местоположение в файле. Например, вызвать fseek
с синтаксисом
fseek(fid,offset,origin);
где:
В качестве альтернативы перемещаться легко в начало файла:
frewind(fid);
Использование ftell
найти текущее положение в данном файле. ftell
возвращает количество байтов с начала файла.
Например, создайте файл five.bin
:
A = 1:5; fid = fopen('five.bin','w'); fwrite(fid, A,'short'); fclose(fid);
Поскольку вызов fwrite
задает short
формат, каждый элемент A
использование два байта устройства хранения данных в five.bin
.
Вновь откройте five.bin
для чтения:
fid = fopen('five.bin','r');
Переместитесь индикатор позиции в файле передают 6 байтов с начала файла:
status = fseek(fid,6,'bof');
Считайте следующий элемент:
four = fread(fid,1,'short');
Действие чтения усовершенствований индикатор позиции в файле. Чтобы определить текущий индикатор позиции в файле, вызовите ftell:
position = ftell(fid) position = 8
Чтобы переместить индикатор позиции в файле назад 4 байта, вызовите fseek
снова:
status = fseek(fid,-4,'cof');
Считайте следующее значение:
three = fread(fid,1,'short');
Различные операционные системы хранят информацию по-другому на байтовом или битовом уровне:
Системы с обратным порядком байтов хранят байты начиная с самого большого адреса в памяти (то есть, они начинают с головки шатуна).
Системы с прямым порядком байтов хранят байты начиная с самого маленького адреса (небольшой конец).
Windows® системы используют порядок байтов с прямым порядком байтов и UNIX® системы используют порядок байтов с обратным порядком байтов.
Чтобы считать файл, созданный в системе противоположного порядка байтов, укажите, что порядок байтов раньше создавал файл. Можно задать упорядоченное расположение в вызове, чтобы открыть файл, или в вызове, чтобы считать файл.
Например, рассмотрите файл со значениями с двойной точностью под названием little.bin
, созданный в системе с прямым порядком байтов. Чтобы считать этот файл в системе с обратным порядком байтов, используйте одну (или оба) следующих команд:
Откройте файл с
fid = fopen('little.bin', 'r', 'l')
Считайте файл с
mydata = fread(fid, 'double', 'l')
где 'l'
указывает на упорядоченное расположение с прямым порядком байтов.
Если вы не уверены, который порядок байтов ваше системное использование, вызовите computer
функция:
[cinfo, maxsize, ordering] = computer
ordering
'L'
для систем с прямым порядком байтов или 'B'
для систем с обратным порядком байтов.