0

这是我的代码

#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。为什么会这样?

4

2 回答 2

3

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

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

代替

    rfile.read((char*)&ob, sizeof(ob));
}
rfile.seekg(0, ios::beg);
于 2013-09-23T17:20:31.773 回答
1

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

在 C++11 中,此函数清除eofbit调用前设置的 if。

于 2013-09-23T17:19:54.273 回答