2011-11-11 5 views

risposta

7

È possibile utilizzare l'opzione 'skip' della funzione FREAD nonché FSEEK di leggere i record uno "colonna" at-a-tempo:

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

Questo codice dovrebbe funzionare per tutti i record file binario in generale , devi solo specificare i tipi di dati e la lunghezza in byte dei campi dei record. Il risultato verrà restituito in una matrice di celle contenente le colonne.

+0

Impressionante. Grazie per l'aiuto. Funziona perfettamente. – shunyo

+0

@shunyo: felice di poterti aiutare. Hai confrontato questo con la tua soluzione usando 'memmapfile' in termini di prestazioni? – Amro

+0

Sì, l'ho fatto. È un miglioramento di 5 volte in termini di velocità. Una soluzione molto utile, la tua. – shunyo

Problemi correlati