2011-11-11 28 views

Trả lời

7

Bạn có thể sử dụng 'skip' tùy chọn của FREAD chức năng cũng như FSEEK để đọc các hồ sơ một "cột" at-a-thời gian:

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

Mã này nên làm việc cho bất cứ hồ sơ nhị phân nộp nói chung , bạn chỉ cần xác định kiểu dữ liệu và độ dài byte của trường bản ghi. Kết quả sẽ được trả về trong một mảng ô có chứa các cột.

+0

Tuyệt vời. Cảm ơn bạn đã giúp đỡ. Nó hoạt động hoàn hảo. – shunyo

+0

@shunyo: vui vì tôi có thể giúp. Bạn đã so sánh điều này với giải pháp của bạn bằng cách sử dụng 'memmapfile' về hiệu suất? – Amro

+0

Vâng tôi đã làm. Nó cải thiện gấp 5 lần về mặt tốc độ. Một giải pháp rất tiện dụng, của bạn. – shunyo

Các vấn đề liên quan