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

Szy*_*orz 9 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;
}
Run Code Online (Sandbox Code Playgroud)

num.txt 文件: 11 22 33 44

程序输出:

number: 11
number: 22
number: 33
number: 44
count: 4
Run Code Online (Sandbox Code Playgroud)

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

number: 11
number: 22
number: 33
count: 3
Run Code Online (Sandbox Code Playgroud)

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

Whi*_*TiM 5

它现在跳过最后一个值。为什么会出现这种情况,什么是之间的区别fileInfileIn.good()

fileIn >> val;
while (fileIn)
{
    ++count;
    cout << "number: " << val << endl;
    fileIn >> val;
}
Run Code Online (Sandbox Code Playgroud)

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

因此,在将最后一个数字读44val. 再次进入循环,因为流没有失败:count增加,val打印,但下一个fileIn >> val将失败。然后将在 while 循环的条件中进行测试,失败将导致循环退出。

这样做fileIn.good()的回报false,如果任何流的的state flags已设置。具体来说eoffailbad


mar*_*inj 5

if (fileIn)相当于,如果或中设置了if (!fileIn.fail())则返回 true 。badbitfailbitrdstate()

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

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

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