ifstream.good()和bool(ifstream)之间的区别

时间:2017-01-29 21:45:24

标签: c++ file-io ifstream

我正在编写一个从文本文件中获取多个变量的程序。 当程序找到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()

2 个答案:

答案 0 :(得分:4)

  

它现在跳过最后一个值。为什么会发生这种情况以及发生了什么?   fileInfileIn.good()之间的差异?

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

对于与"11 22 33 44"关联的流中的fileIn的给定内容。使用bool(fileIn) conversion operator将返回流是否未发生故障。请注意,达到eof()不会导致流失败。失败基本上是在I / O操作失败时。

因此,在将最后一个号码44读入val之后。再次输入循环,因为流未失败:count递增,打印val,但下一个fileIn >> val将失败。然后将在while循环条件下测试,失败将导致循环退出。

如果已设置了任何流fileIn.good(),则state flags会返回false。具体而言,eoffailbad

答案 1 :(得分:2)

if (!fileIn.fail())相当于badbit,如果在failbit中设置rdstate()fileIn.good(),则返回true。

另一方面rdstate()检查fail()是否等于0.因此除了eofbit之外,它还会检查val标志。

  

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

因为您阅读了while(fileIn.good()),然后使用fileIn检查流的条件,然后输出最后一个值,由于eofbit设置了if(infs),因此永远不会看到该值。如上所述{{1}}未对其进行检查。