为什么可以使用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之后的下一个数字时,循环退出。
编辑:修正"reason why it counts wrong"以澄清eof()在" failed read"之后设置。
还应该指出,while(!file.eof())
不能很好地工作与不良输入。假设我们有上面的代码,但输入是11 22 aa ...
-当输入是aa
时,eof()不会被设置。输入只是停止并返回一个错误。但是由于eof()仍然是false(技术上我们可以从文件中读取更多内容,只要我们不尝试将其作为数字读取)。这就导致了一个无限循环!while (file >> variable)
解决方案避免了这个问题——当然,您可能仍然需要添加一些额外的代码来说明"我期望这里是一个数字,但我得到了其他东西"。但是你不必担心循环会永远不读取任何内容。
有时是为了方便;或者,它们返回一个可强制转换为bool的类型。您应该参考这些函数(或流操作符)的文档。