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

Низкоуровневые функции для того, чтобы импортировать данные

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

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

  • 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);

где:

  • fid идентификатор файла, полученный из fopen.

  • offset положительное или отрицательное значение смещения, заданное в байтах.

  • origin задает местоположение, от которого можно вычислить положение:

    'bof'

    Начало файла

    'cof'

    Текущее положение в файле

    'eof'

    Конец файла

В качестве альтернативы перемещаться легко в начало файла:

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' для систем с обратным порядком байтов.