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

如何在MATLAB中逐字节读取二进制格式,matlab,fread,Matlab,Fread,我一直在努力解决这个问题。当使用MATLAB读取包含三列浮点格式数字的二进制文件时 我用这条线一次读一个数字 pt(j) = fread(fid,1,'float','a'); 我发现有时候MATLAB很少使用5个字节,而不是为浮点读取4个字节。它错过了剩下的阅读。我不确定该文件是否已损坏或MATLAB存在缺陷。当我以txt格式打印文件并以txt格式读取时,一切正常 我在这里的工作就是: cur = ftell(fid); if (cur - prev)~= 4 pt(j)

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

我用这条线一次读一个数字

    pt(j) = fread(fid,1,'float','a');
我发现有时候MATLAB很少使用5个字节,而不是为浮点读取4个字节。它错过了剩下的阅读。我不确定该文件是否已损坏或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; 
我尝试了不同格式的不同组合float32 float64等等。。。在这个特定位置,MATLAB总是读取5个字节而不是4个字节

编辑: 根据克里斯的回答来解决这个问题。我正在使用此命令打开文件

fid = fopen(fname,'rt');
我把它换成了这个

fid = fopen(fname,'r');

有时,很少跳过一个字节。听起来你好像在Windows上,并且已经以文本模式打开了文件。看

在Windows上以文本模式打开文件时,序列\r\n 13,10将替换为\r\n 10。这件事发生在弗雷德到达之前

因此,在打开文件时,不要执行以下操作:

fid = fopen('name', 'rt');
这里的t表示文本。相反,要:

fid = fopen('name', 'r');
要使其明确,您可以将b添加到权限中。这没有文档记录,但应该是二进制的,并且使调用类似于在C或POSIX fopen中所做的操作:


有时,很少跳过一个字节。听起来你好像在Windows上,并且已经以文本模式打开了文件。看

在Windows上以文本模式打开文件时,序列\r\n 13,10将替换为\r\n 10。这件事发生在弗雷德到达之前

因此,在打开文件时,不要执行以下操作:

fid = fopen('name', 'rt');
这里的t表示文本。相反,要:

fid = fopen('name', 'r');
要使其明确,您可以将b添加到权限中。这没有文档记录,但应该是二进制的,并且使调用类似于在C或POSIX fopen中所做的操作:


你的读数不应该是ptj=freadfid,1,'float',0,'a';。在原始语句中,变量a代替了参数…@Hoki Nope,skip是可选的。这没关系。我想我知道这里发生了什么,肯定会给出答案。但您可能希望在问题中包括如何打开文件。您的读取位置不应该是ptj=freadfid,1,'float',0,'a';。在原始语句中,变量a代替了参数…@Hoki Nope,skip是可选的。这没关系。我想我知道这里发生了什么,肯定会给出答案。但是你可能想在你的问题中包括如何打开文件。哇,你是冠军先生。它起作用了。我使用的“rt”和你描述的一模一样。当我删除“t”时。它就像一个符咒。谢谢你。@Samer。。。我还建议遵循他最后的建议,通过使用rb.wow使二进制格式显式化,你是冠军先生。它起作用了。我使用的“rt”和你描述的一模一样。当我删除“t”时。它就像一个符咒。谢谢你。@Samer。。。我还建议遵循他最后的建议,使用rb使二进制格式显式化。