2011-11-11 15 views

Respuesta

7

Usted puede utilizar la opción 'skip' de la función FREAD, así como FSEEK para leer los registros de una "columna" en-un-tiempo:

%# 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); 

Este código debería funcionar para cualquier registro de archivo binario en general , solo tiene que especificar los tipos de datos y la longitud del byte de los campos de los registros. El resultado se devolverá en una matriz de celdas que contiene las columnas.

+0

Impresionante. Gracias por tu ayuda. Funciona perfectamente – shunyo

+0

@shunyo: me alegro de poder ayudar. ¿Ha comparado esto con su solución usando 'memmapfile' en términos de rendimiento? – Amro

+0

Sí, lo hice. Es una mejora de 5 veces en términos de velocidad. Una solución muy útil, la tuya. – shunyo

Cuestiones relacionadas