我必须从二进制文件读取数据。
该二进制数据格式为:
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并再次查找。

10-04 13:00