Чтение двоичных файлов с множественной точностью через fread в Matlab - PullRequest
6 голосов
/ 11 ноября 2011

У меня есть огромный двоичный файл, который имеет записи с множественной точностью как {'Double', 'Double', 'Int32', 'Int8', 'Char'}.Я использовал memmapfile для чтения данных, но он мучительно медленный для чтения данных.Есть ли способ прочитать весь файл через fread?

1 Ответ

8 голосов
/ 13 ноября 2011

Вы можете использовать опцию 'skip' функции FREAD , а также FSEEK для чтения записей по одному «столбцу» за раз:

%# type and size in byte of the record fields
recordType = {'double' 'double' 'int32' 'int8' 'char'};
recordLen = [8 8 4 1 1];
R = cell(1,numel(recordType));

%# read column-by-column
fid = fopen('file.bin','rb');
for i=1:numel(recordType)
    %# seek to the first field of the first record
    fseek(fid, sum(recordLen(1:i-1)), 'bof');

    %# % read column with specified format, skipping required number of bytes
    R{i} = fread(fid, Inf, ['*' recordType{i}], sum(recordLen)-recordLen(i));
end
fclose(fid);

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

...