как читать двоичный формат побайтно в MATLAB - PullRequest
0 голосов
/ 14 ноября 2018

Я боролся с этой ошибкой.При использовании MATLAB для чтения двоичного файла, который содержит три столбца чисел в форматах float.

Я читаю по одному номеру за раз, используя эту строку.

    pt(j) = fread(fid,1,'float','a');

Я обнаружил, что иногда (редко) MATLAB вместо чтения четырех байтов для числа с плавающей запятой, он использует 5 байтов.И это пропускает остальную часть чтения.Я не уверен, что файл поврежден или MATLAB содержит ошибку там.Когда я распечатал файл как текст и прочитал его, все работает хорошо.

В качестве решения этой проблемы я сделал следующее:

cur = ftell(fid);
if (cur - prev)~= 4
      pt(j) = 0; % I m throwing this reading away for the sake of saving the rest of the data. This is not ideal 
      cur = prev +4;
      fseek(fid, cur,'bof');
end
prev = cur; 

Я пробовал разные комбинации разных форматов float32 float64 и т. Д ... ничего не работает MATLAB всегда читал 5байтов вместо 4 в этом конкретном месте.

РЕДАКТИРОВАТЬ: Решить это на основе ответа Криса.Я использовал эту команду, чтобы открыть файл.

fid = fopen(fname,'rt');

Я заменил его на

fid = fopen(fname,'r');

1 Ответ

0 голосов
/ 14 ноября 2018

Иногда, редко, пропуская байт. Мне кажется, что вы находитесь в Windows и открыли файл в текстовом режиме. См. параметр permissions для функции fopen .

При открытии файла в текстовом режиме в Windows последовательность \r\n (13,10) заменяется на \n (10). Это происходит до того, как fread доберется до него.

Итак, при открытии файла не делайте:

fid = fopen('name', 'rt');

t здесь обозначает «текст». Вместо этого выполните:

fid = fopen('name', 'r');

Чтобы сделать это явным, вы можете добавить b к разрешениям. Это не задокументировано, но должно означать «двоичный» и делает вызов аналогичным тому, что вы делаете в C или в POSIX fopen():

fid = fopen('name', 'rb');
...