我要从二进制文件中读取数据。 这种二进制数据格式是: 0x00 0x00 0x01 - 是分隔符 在此分隔符之后有原始数据字节数组。 总而言之,我的二进制文件如下所示:
0x00 0x00 0x01(这里是原始数据字节) 0x00 0x00 0x01(这是另一个块 原始数据字节)0x00 0x00 0x01 ....
所以我编写了这样的代码来解析我的文件(我对C不是很熟悉)
ifstream inp("myfile.bin",ios::binary);
char b1, b2, b3;
while (!inp.eof())
{
inp.read(&b1,sizeof(b1));
inp.read(&b2,sizeof(b2));
inp.read(&b3,sizeof(b3));
//finding first delimiter (data starts from delimiter)
while (!((0==b1)&&(0==b2)&&(1==b3)))
{
b1=b2;
b2=b3;
if (inp.eof())
break;
inp.read(&b3,sizeof(b3));
}
if (inp.eof())
break;
char* raw=new char[65535];
int rawSize=0;
inp.read(&b1,sizeof(b1));
inp.read(&b2,sizeof(b2));
inp.read(&b3,sizeof(b3));
raw[rawSize++]=b1;
raw[rawSize++]=b2;
if (inp.eof())
break;
//reading raw data until delimiter is found
while (!((0==b1)&&(0==b2)&&(1==b3)))
{
raw[rawSize++]=b3;
b1=b2;
b2=b3;
if (inp.eof())
break;
inp.read(&b3,sizeof(b3));
}
rawSize-=2; //because of two bytes of delimiter (0x00 0x00) would be added to raw
//Do something with raw data
if (inp.eof())
break;
inp.putback(1);
inp.putback(0);
inp.putback(0);
delete []raw;
}
但有时这段代码会陷入无限循环。 你能给我一些建议吗? 感谢
答案 0 :(得分:1)
我认为问题是putback
失败了。据我所知,putback
保证只能工作一次;如果内部读缓冲区是对齐的,那么第二次调用将失败(即,非常罕见;看起来像你的情况)。
要修复,请删除putback
。首先,将循环注释为“查找第一个分隔符”从外部while
循环中删除:注释表明此代码应该只运行一次。执行此操作后,请注意在外部while
循环的开头,刚刚找到序列0x00 0x00 0x01
,因此代码不必使用putback
并查找再一次。
答案 1 :(得分:0)
您使用feof()
错误,只有在尝试读取失败后才有效。
你怎么知道你的魔术字节序列0 0 1没有出现在数据中?如果数据只是一个“二进制数组”,听起来不像它提供了很多保证......