我必须从二进制文件读取数据。
该二进制数据格式为:
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;
}
但是有时这段代码会陷入无限循环。
你能给我一些建议吗?
谢谢
最佳答案
我认为问题在于putback
失败。据我记得,putback
保证只能工作一次;如果内部读取缓冲区对齐,则第二次调用将失败(也就是说,很少;看起来像您的情况)。
要解决此问题,请摆脱putback
。首先,将注释为“查找第一个定界符”的循环移出外部while
循环:注释表明该代码只应运行一次。完成后,请注意,在外部while
循环的开始处,刚刚找到了0x00 0x00 0x01
序列,因此该代码不必使用putback
并再次查找。