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()?
它现在跳过最后一个值。为什么会出现这种情况,什么是之间的区别
fileIn和fileIn.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 操作失败。
因此,在将最后一个数字读44入val. 再次进入循环,因为流没有失败:count增加,val打印,但下一个fileIn >> val将失败。然后将在 while 循环的条件中进行测试,失败将导致循环退出。
这样做fileIn.good()的回报false,如果任何流的的state flags已设置。具体来说eof,fail和bad
if (fileIn)相当于,如果或中设置了if (!fileIn.fail())则返回 true 。badbitfailbitrdstate()
另一方面fileIn.good()检查是否rdstate()等于0。所以除了fail()它还检查eofbit标志。
现在它会跳过最后一个值。为什么会发生这种情况? fileIn 和 fileIn.good() 之间有什么区别?
因为您读取val然后使用检查流的条件while(fileIn.good()),然后输出最后一个值,该值永远不会被看到,因为 thenfileIn已eofbit设置。if(infs)如上所述,没有经过检查。