exponenta event banner

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

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

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

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

  • fscanf, которая считывает форматированные данные в текстовом или ASCII-файле; то есть файл, который можно просмотреть в текстовом редакторе. Дополнительные сведения см. в разделе Чтение данных в форматированном шаблоне.

  • fgetl и fgets, которые считывают одну строку файла за раз, где символ новой строки разделяет каждую строку. Дополнительные сведения см. в разделе Построчное чтение данных.

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

Примечание

Низкоуровневые файловые функции ввода-вывода основаны на функциях библиотеки ANSI ® Standard 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');

Чтение файлов, созданных в других системах

Различные операционные системы по-разному хранят информацию на уровне байтов или битов:

  • Системы Big-endian хранят байты, начинающиеся с наибольшего адреса в памяти (то есть начинаются с большого конца).

  • Системы Little-endian хранят байты, начиная с наименьшего адреса (маленький конец).

Системы Windows ® используют порядок байтов little-endian, а системы UNIX ® - big-endian.

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

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

  • Откройте файл с помощью

    fid = fopen('little.bin', 'r', 'l')
  • Прочитать файл с помощью

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

где 'l' обозначает порядок little-endian.

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

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