读二进制文件

时间:2011-04-20 13:53:19

标签: c++ binaryfiles eof

我要从二进制文件中读取数据。 这种二进制数据格式是: 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;
    }

但有时这段代码会陷入无限循环。 你能给我一些建议吗? 感谢

2 个答案:

答案 0 :(得分:1)

我认为问题是putback失败了。据我所知,putback保证只能工作一次;如果内部读缓冲区是对齐的,那么第二次调用将失败(即,非常罕见;看起来像你的情况)。

要修复,请删除putback。首先,将循环注释为“查找第一个分隔符”从外部while循环中删除:注释表明此代码应该只运行一次。执行此操作后,请注意在外部while循环的开头,刚刚找到序列0x00 0x00 0x01,因此代码不必使用putback并查找再一次。

答案 1 :(得分:0)

  • 您使用feof()错误,只有在尝试读取失败后才有效

  • 你怎么知道你的魔术字节序列0 0 1没有出现在数据中?如果数据只是一个“二进制数组”,听起来不像它提供了很多保证......