我正在编写一个从文本文件中获取多个变量的程序。
当程序找到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()
?
答案 0 :(得分:4)
它现在跳过最后一个值。为什么会发生这种情况以及发生了什么?
fileIn
和fileIn.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
。具体而言,eof
,fail
和bad
答案 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}}未对其进行检查。