在C ++中重置ifstream对象的文件结束状态

时间:2011-10-06 23:18:08

标签: c++ file iostream

我想知道是否有办法在C ++中重置eof状态?

3 个答案:

答案 0 :(得分:26)

对于文件,您可以寻找任何位置。例如,要回到开头:

std::ifstream infile("hello.txt");

while (infile.read(...)) { /*...*/ } // etc etc

infile.clear();                 // clear fail and eof bits
infile.seekg(0, std::ios::beg); // back to the start!

如果您已经阅读了结尾,则必须使用{Jerry Coffin建议的clear()重置错误标记。

答案 1 :(得分:5)

据推测,你的意思是在iostream上。在这种情况下,流的clear()应该完成工作。

答案 2 :(得分:1)

我同意上面的答案,但今晚遇到了同样的问题。所以我想我会发布一些更多教程的代码,并在流程的每一步显示流的位置。我可能应该在这里查一下......之前......我花了一个小时自己解决这个问题。

ifstream ifs("alpha.dat");       //open a file
if(!ifs) throw runtime_error("unable to open table file");

while(getline(ifs, line)){
         //......///
}

//reset the stream for another pass
int pos = ifs.tellg();
cout<<"pos is: "<<pos<<endl;     //pos is: -1  tellg() failed because the stream failed

ifs.clear();
pos = ifs.tellg();
cout<<"pos is: "<<pos<<endl;      //pos is: 7742'ish (aka the end of the file)

ifs.seekg(0);
pos = ifs.tellg();               
cout<<"pos is: "<<pos<<endl;     //pos is: 0 and ready for action

//stream is ready for another pass
while(getline(ifs, line) { //...// }