【问题标题】:Is calling clear() on an ifstream problematic?在 ifstream 上调用 clear() 是否有问题?
【发布时间】:2019-06-29 10:34:55
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    首先让我在这里的术语非常准确。当设置了坏位或失败位时,循环结束,但碰巧当设置了 eof 位时,失败位也被设置了。

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

    【讨论】:

    • 为什么seekg() 行为更改为清除eofbit 而不是failbit?考虑到eofbitfailbit 都将被设置,这对我来说似乎很奇怪。
    猜你喜欢
    • 1970-01-01
    • 2013-04-28
    • 2019-03-15
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    相关资源
    最近更新 更多