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

Низкоуровневые функции для импорта данных

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

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

  • 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 functions, перемещает индикатор положения файла.

Используйте 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® системы используют big-endian упорядоченное расположение байтов.

Чтобы считать файл, созданный в противоположной системе, задайте упорядоченное расположение байтов, используемый для создания файла. Вы можете задать упорядоченное расположение в вызове, чтобы открыть файл, или в вызове, чтобы считать файл.

Например, рассмотрите файл с именованными значениями двойной точности little.bin, созданный по малоэндовой системе. Чтобы считать этот файл в большой эндовой системе, используйте одну (или обе) из следующих команд:

  • Откройте файл с

    fid = fopen('little.bin', 'r', 'l')
  • Чтение файла с

    mydata = fread(fid, 'double', 'l')

где 'l' указывает на маленькое-эндовое упорядоченное расположение.

Если вы не уверены, какой заказ байтов использует ваша система, вызовите computer функция:

[cinfo, maxsize, ordering] = computer
Возвращенный ordering является 'L' для маленьких эндовых систем или 'B' для систем с большим эндом.