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

Is calling clear() on an ifstream problematic?

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

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

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

首先,让我在这里非常准确地使用术语。当 bad 位或 fail 位被设置时循环结束,但碰巧当 eof 位被设置时 fail 位也被设置。

bad 位表示更严重(不可恢复)的错误,因此如果您检查 istream.bad() 为假,调用 clear 重用流应该没问题。