二进制文件不能多次使用?

时间:2013-09-23 17:11:59

标签: c++ file-handling

继承我的代码

#include <iostream>
#include <fstream>

using namespace std;

struct a
{
    int x;
    int b;
};

int main ()
{

ifstream rfile("test.bin", ios::binary);
a ob;

//Reading from the file for the first time works fine.
rfile.read((char*)&ob, sizeof(ob));
while (rfile) 
{
    cout<<ob.x<<endl;
    rfile.read((char*)&ob, sizeof(ob));
}
rfile.seekg(0, ios::beg);

cout<<"G:"<<rfile.tellg()<<endl; //Outputs -1
rfile.read((char*)&ob, sizeof(ob));
while (rfile) 
{
    cout<<ob.x<<endl;
    rfile.read((char*)&ob, sizeof(ob));
}


return 0;
}

输出

3
1
G:-1

因为在第一个循环工作和第二个循环剂量工作,因为即使在使用seekg()之后指针的位置仍为-1。为什么会这样?

2 个答案:

答案 0 :(得分:3)

ifstream在第一次循环后处于无效状态,您需要在流上的任何进一步操作之前重置流状态标志。

    rfile.read((char*)&ob, sizeof(ob));
}
rfile.clear();
rfile.seekg(0, ios::beg);

而不是

    rfile.read((char*)&ob, sizeof(ob));
}
rfile.seekg(0, ios::beg);

答案 1 :(得分:1)

这是因为在C ++ 98中,seekg()的行为与C ++ 11不同。在C ++ 98中,如果在调用之前设置了eofbit标志,则函数将失败(设置failbit并返回)。你可以检查返回值来验证。

在C ++ 11中,如果在调用之前设置,此函数将清除eofbit