我有一个函数可以像这样循环读取固定格式的文件:
istream.seekg(0, std::ios::begin);
while (istream >> x >> y) {
// do something
}
正如我发现的那样,并且在退出循环后在这里已经详细记录了eofbit
和failbit
都已设置。我希望能够在下次调用该函数时重新读取文件,而无需关闭并重新打开ifstream
,因此要使其正常工作,我必须首先添加一个istream.clear()
。我觉得奇怪的是,自c ++ 11起,seekg()
的记录为行为表明它将清除eofbit
,但对于failbit
却没有任何作用,这是{ {1}}对我来说似乎毫无用处。无论如何,以任何方式调用seekg()
都是有问题的,例如隐藏任何潜在的错误条件等?
答案 0 :(得分:2)
首先,请允许我在这里用术语非常精确。当设置了不良位或故障位时,循环结束,但是当设置了eof位时,也会设置故障位。
bad
位表示更严重(不可恢复)的错误,因此,如果您检查istream.bad()
为假,则调用clear
重用流就可以了。