如何在MATLAB中逐字节读取二进制格式

Sam*_*mer 1 matlab fread

我一直在努力解决这个问题.使用MATLAB读取包含float格式的三列数字的二进制文件时.

我正在使用这一行一次读一个数字.

    pt(j) = fread(fid,1,'float','a');
Run Code Online (Sandbox Code Playgroud)

我发现有时(很少)MATLAB而不是为浮点读取四个字节,它使用5个字节.它错过了其余的阅读.我不确定文件是否已损坏或MATLAB存在错误.当我将文件打印为txt并在txt中读取时,一切正常.

我在这里做的工作就是:

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; 
Run Code Online (Sandbox Code Playgroud)

我尝试了不同格式的不同组合float32 float64等...... MATLAB在这个特定的位置,没有什么可以读取5个字节而不是4个字节.

编辑:根据克里斯的答案解决它.我正在使用此命令打开文件.

fid = fopen(fname,'rt');
Run Code Online (Sandbox Code Playgroud)

我用它替换了它

fid = fopen(fname,'r');
Run Code Online (Sandbox Code Playgroud)

Cri*_*ngo 7

有时,很少,跳过一个字节.听起来像你在Windows上,并以文本模式打开文件.请参阅功能permissions参数fopen.

在Windows上以文本模式打开文件时,序列\r\n(13,10)将替换为\n(10).这种情况发生在fread它之前.

所以,打开文件时,不要这样做:

fid = fopen('name', 'rt');
Run Code Online (Sandbox Code Playgroud)

t这里表示"文本".相反,做:

fid = fopen('name', 'r');
Run Code Online (Sandbox Code Playgroud)

要明确这一点,您可以添加b权限.这没有记录,但应该表示"二进制",并使调用类似于您在C或POSIX中执行的操作fopen():

fid = fopen('name', 'rb');
Run Code Online (Sandbox Code Playgroud)