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

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

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

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

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

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

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

Примечание

Низкоуровневые функции ввода-вывода файлов основаны на функциях в библиотеке ANSI® Standard C Library. Однако<sup class="" contenteditable="">However, MATLAB®</sup>&nbsp; включает векторизованные версии функций для чтения и записи данных в массив с минимальными циклами управления.

Чтение двоичных данных в файле

Как с любой из низкоуровневых функций ввода-вывода, перед импортом, открывают файл с fopen, и получите идентификатор файла. Когда вы закончили обрабатывать файл, закрываете его с fclose(fileID).

По умолчанию, fread читает файл 1 байт за один раз и интерпретирует каждый байт как 8-битное беззнаковое целое (uint8fread создает вектор-столбец, с одним элементом для каждого байта в файле. Значения в вектор-столбце имеют класс 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' для систем с обратным порядком байтов.

Вводные файлы с различными кодировками символов

Схемы кодирования поддерживают символы, требуемые для конкретных алфавитов, таких как те для японского или европейских языков. Общие схемы кодирования включают US-ASCII или UTF-8.

Схема кодирования определяет количество байтов, требуемых считать или записать char значения. Например, символы US-ASCII всегда используют 1 байт, но символы UTF-8 используют до 4 байтов. MATLAB автоматически обрабатывает необходимое количество байтов для каждого char значение на основе заданной схемы кодирования. Однако, если вы задаете uchar точность, процессы MATLAB каждый байт как uint8, независимо от заданного кодирования.

Если вы не задаете схему кодирования, fopen открывает файлы для обработки использования кодировки по умолчанию для вашей системы. Чтобы определить значение по умолчанию, откройте файл и вызовите fopen снова с синтаксисом:

[filename, permission, machineformat, encoding] = fopen(fid);

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

Для полного списка поддерживаемых схем кодирования и синтаксиса для определения кодирования, смотрите fopen страница с описанием.