【问题标题】:Difference between ifstream.good() and bool(ifstream)ifstream.good() 和 bool(ifstream) 的区别
【发布时间】:2017-01-29 21:45:23
【问题描述】:

我正在编写一个从文本文件中获取多个变量的程序。 当程序找到EOF时,
它结束输入数据。

int main()
{
    int val, count = 0;
    ifstream fileIn;
    fileIn.open("num.txt");

    fileIn >> val;
    while (fileIn)
    {
        ++count;
        cout << "number: " << val << endl;
        fileIn >> val;
    }
    cout << "count: " << count << endl;

    fileIn.close();
    return 0;
}

num.txt 文件:11 22 33 44

程序输出:

number: 11
number: 22
number: 33
number: 44
count: 4

一切正常。但是,如果我将 while 条件部分从 fileIn 更改为 fileIn.good()
程序输出将如下所示:

number: 11
number: 22
number: 33
count: 3

它现在跳过最后一个值。 为什么会发生这种情况,fileIn 之间有什么区别
fileIn.good()?

【问题讨论】:

标签: c++ file-io ifstream


【解决方案1】:

它现在跳过最后一个值。为什么会发生这种情况以及是什么 fileInfileIn.good() 的区别?

fileIn >> val;
while (fileIn)
{
    ++count;
    cout << "number: " << val << endl;
    fileIn >> val;
}

对于与fileIn 关联的流中的给定内容"11 22 33 44"。使用bool(fileIn) conversion operator 将返回流是否没有失败。请注意,到达eof() 并不是流失败。失败基本上是 I/O 操作失败。

所以,在将最后一个数字44 读入val 之后。因为流没有失败,所以再次进入循环:count 递增,val 被打印,但下一个fileIn &gt;&gt; val 将失败。然后将在while循环的条件下进行测试,失败将导致循环退出。

如果任何流的state flags 已设置,则执行fileIn.good() 将返回false。具体来说,eoffailbad

【讨论】:

    【解决方案2】:

    if (fileIn) 等价于if (!fileIn.fail()),如果在rdstate() 中设置了badbitfailbit,则返回true。

    另一方面,fileIn.good() 检查 rdstate() 是否等于 0。所以除了 fail() 它还检查 eofbit 的标志。

    它现在跳过最后一个值。为什么会发生这种情况,fileIn 之间有什么区别 和 fileIn.good()?

    因为您读取了val,然后使用while(fileIn.good()) 检查流的条件,然后输出最后一个值,因为fileIn 设置了eofbit,所以永远不会看到。如上所述,if(infs) 没有检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-19
      • 2016-04-19
      • 1970-01-01
      • 2018-08-07
      • 2015-07-30
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      相关资源
      最近更新 更多