在ifstream上调用clear()是否有问题?

时间:2019-02-05 15:01:57

标签: c++ c++11 fstream iostream

我有一个函数可以像这样循环读取固定格式的文件:

istream.seekg(0, std::ios::begin);
while (istream >> x >> y) {
  // do something
}

正如我发现的那样,并且在退出循环后在这里已经详细记录了eofbitfailbit都已设置。我希望能够在下次调用该函数时重新读取文件,而无需关闭并重新打开ifstream,因此要使其正常工作,我必须首先添加一个istream.clear()。我觉得奇怪的是,自c ++ 11起,seekg()的记录为行为表明它将清除eofbit,但对于failbit却没有任何作用,这是{ {1}}对我来说似乎毫无用处。无论如何,以任何方式调用seekg()都是有问题的,例如隐藏任何潜在的错误条件等?

1 个答案:

答案 0 :(得分:2)

首先,请允许我在这里用术语非常精确。当设置了不良位或故障位时,循环结束,但是当设置了eof位时,也会设置故障位。

bad位表示更严重(不可恢复)的错误,因此,如果您检查istream.bad()为假,则调用clear重用流就可以了。