为什么可以使用 while 循环读取文件,例如
while (file >> variable)
或者
while (getline(xx, yy))
>>
和函数是否getline
返回布尔值?
为什么可以使用 while 循环读取文件,例如
while (file >> variable)
或者
while (getline(xx, yy))
>>
和函数是否getline
返回布尔值?
流运算符评估为对流本身的引用。这允许链接例如file >> variable >> variable >> variable
。
当您将它与流对象可转换为布尔值的事实结合起来时(true
如果没有设置错误标志,则其值是),是的,您会得到这种效果。
如果我们有类似的东西:
包含数据的文件:
11
22
13
45
19
然后是一个 C++ 文件:
int variable;
int count = 0;
while(!file.eof())
{
count ++;
file >> variable;
}
cout << "there are " << count << " numbers in the file";
输出将是 6,因为当我们读取 19 时,eof 为假,只有当我们尝试读取 NEXT 数字时,才会设置 eof。我们可以通过将 count++ 移动到 if 语句来解决这个问题,所以我们有if (file >> variable) count++;
。但这变得相当笨拙。
如果我们改为:
while(file >> variable)
{
count++;
}
当我们尝试读取 19 之后的下一个数字时,循环退出。
编辑:修复“错误计数的原因”以澄清 eof() 是在“读取失败”之后设置的。
还应该指出,在while(!file.eof())
输入错误的情况下效果不佳。假设我们有上面的代码,但是输入是11 22 aa ...
- 当输入是 .eof() 时没有设置aa
。输入只是停止并返回错误。但是由于 eof() 仍然是错误的[从技术上讲,我们可以从文件中读取更多内容,只要我们不尝试将其读取为数字]。所以这会导致无限循环!该while (file >> variable)
解决方案避免了这个问题 - 当然,您可能仍然需要添加一些额外的代码来表示“我希望这里有一个数字,但我得到了其他东西”。但是您不必担心循环会一直持续下去,什么也不读。
有时它们是为了方便而制作的;或者,它们返回一个可转换为 bool 的类型。您应该参考这些函数(或流操作符)的文档。