在 ifstream 上调用 clear() 有问题吗?
Is calling clear() on an ifstream problematic?
我有一个函数可以像这样循环读取具有固定格式的文件:
istream.seekg(0, std::ios::begin);
while (istream >> x >> y) {
// do something
}
正如我发现的那样,在循环退出后,eofbit
和 failbit
都已设置,并且已在此处详细记录。我希望能够在下次调用该函数时再次重新读取文件,而无需关闭并重新打开 ifstream
因此要使其正常工作,我必须先添加一个 istream.clear()
。对我来说似乎很奇怪,因为 c++11 seekg()
的记录行为说它将清除 eofbit
但它对 failbit
没有做任何事情,这使得 seekg()
对我来说似乎没用。无论如何,以任何方式调用 clear()
是否有问题,例如隐藏任何潜在的错误条件等?
首先,让我在这里非常准确地使用术语。当 bad 位或 fail 位被设置时循环结束,但碰巧当 eof 位被设置时 fail 位也被设置。
bad
位表示更严重(不可恢复)的错误,因此如果您检查 istream.bad()
为假,调用 clear
重用流应该没问题。
我有一个函数可以像这样循环读取具有固定格式的文件:
istream.seekg(0, std::ios::begin);
while (istream >> x >> y) {
// do something
}
正如我发现的那样,在循环退出后,eofbit
和 failbit
都已设置,并且已在此处详细记录。我希望能够在下次调用该函数时再次重新读取文件,而无需关闭并重新打开 ifstream
因此要使其正常工作,我必须先添加一个 istream.clear()
。对我来说似乎很奇怪,因为 c++11 seekg()
的记录行为说它将清除 eofbit
但它对 failbit
没有做任何事情,这使得 seekg()
对我来说似乎没用。无论如何,以任何方式调用 clear()
是否有问题,例如隐藏任何潜在的错误条件等?
首先,让我在这里非常准确地使用术语。当 bad 位或 fail 位被设置时循环结束,但碰巧当 eof 位被设置时 fail 位也被设置。
bad
位表示更严重(不可恢复)的错误,因此如果您检查 istream.bad()
为假,调用 clear
重用流应该没问题。