fread: how to read n bytes from bin files

34 vues (au cours des 30 derniers jours)
Alexander Voznesensky
Alexander Voznesensky le 7 Juil 2017
Modifié(e) : Guillaume le 10 Juil 2017
Hi! I have a binary file. It consists of records: 8 byte long, 4 byte float, 4 byte float, 4 byte float. I want to read the file into array Nx4. N - records number. How can I do it? I tried fread but without result.
  1 commentaire
Alexander Voznesensky
Alexander Voznesensky le 7 Juil 2017
Is it correct?
fid = fopen('acc-angle.bin', 'rb'); % открытие файла на чтение
if fid == -1 % проверка корректности открытия
error('File is not opened');
end
time=[];
ax=[];
ay=[];
az=[];
records_num=0;
while ~feof(fid)
time = [time; fread(fid,1,'int64')];
ax= [ax; fread(fid,1,'float32')];
ay= [ay; fread(fid,1,'float32')];
az= [az; fread(fid,1,'float32')];
records_num=records_num+1;
end
fclose(fid);

Connectez-vous pour commenter.

Réponse acceptée

Guillaume
Guillaume le 7 Juil 2017
Modifié(e) : Guillaume le 8 Juil 2017
Is it correct? The easiest way for you to find out is to try.
fid = fopen('acc-angle.bin', 'rb')
There's no 'b' option for fopen permissions. 'r' is all that is needed for binary.
Otherwise, your code looks ok to me as long as your file has little endian encoding. A faster option would be to read all records at once using the skip parameter of fread, something like:
fid = fopen('acc-angle.bin', 'r');
time = fread(fid, Inf, 'int64', 12);
fseek(fid, 'bof', 8);
ax = fread(fid, Inf, 'single', 16);
fseek(fid, 'bof', 12);
ay = fread(fid, Inf, 'single', 16);
fseek(fid, 'bof', 16);
az = fread(fid, Inf, 'single', 16);
fclose(fid);
  7 commentaires
Guillaume
Guillaume le 9 Juil 2017
Modifié(e) : Guillaume le 10 Juil 2017
If it's the same for the whole file, in the call to fopen:
fid = fopen('acc-angle.bin', 'r', 'b'); %b for big endian
If it varies per field, in the call to fread:
time = fread(fid, Inf, 'int64', 12, 'b');
Walter Roberson
Walter Roberson le 9 Juil 2017
At the time you do the fopen() you can specify a byte order that is to apply by default to future fread().
Or, for each fread() you can specify the byte order.
Or, you can swapbytes() after doing the reading.

Connectez-vous pour commenter.

Plus de réponses (1)

Walter Roberson
Walter Roberson le 7 Juil 2017
memmapfile allows you to declare patterns of fields and so is suitable for reading in repeated structures.

Catégories

En savoir plus sur Low-Level File I/O dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by