[英]C++: I don't understand how this while loop works
我正在看这里的一些问题,这些问题向您展示了如何从txt文件读取内容,然后将其中的任何内容分配给单独的变量。 答案使用了一个while循环,看起来像这样……
ifstream file(“file.txt”);
int var1;
int var2;
int var3;
while (file >> var1 >> var2 >> var3)
{
/* do something with name, var1 etc. */
cout << var1 << var2 << var3 << “\n”;
}
我的问题是,while循环中发生了什么,它允许它为那些变量分配正确的值? 我知道它有效,因为我使用过它,但是我只是不明白它是如何工作的。
这是我正在查看的链接,以防万一有人想要也查看它。 C ++:从文本文件读取并分成变量
谢谢!
基本上,“表达式” (a) file >> var1 >> var2 >> var3
将尝试从file
流中读取三个值并将它们放入指定的变量中。 基本上,它本身与cin >> myVar
没什么不同(除了它是将输入更改为多个变量)。
当且仅当成功读取所有三个值时,整个表达式的值才为true。
在这种情况下,将执行循环主体,将打印出三个值,然后循环将返回顶部并尝试获取下三个值。
在表达式的计算结果为假的点(即未读取三个值),循环将停止。
(a)从someStream >> someVariable
到Boolean值的实际路径涉及流类中的几个步骤(将operator>>
的返回值转换为带有operator bool
的Boolean),但是以上解释对于大多数人来说应该足够好目的。
ifstream重载operator >> 。 在您的特定情况下,它是:
basic_istream& operator>>( int& value );
如您所见,它返回对自身的引用,因此您可以重写:
while (file >> var1 >> var2 >> var3)
作为函数调用:
while (file.operator>>(var1).operator>>(var2).operator>>(var3))
另外,ifstream明确转换为bool,如果stream正常,则为true,否则为false。 使用操作符bool进行此转换,该操作符被标记为显式的 (C ++ 11及更高版本)。 应用于转换运算符的该说明符允许在while
循环或if
语句中使用ifstream
实例,但不允许您例如将其分配给bool变量:
bool b = file; // results in error
编译器会将file >> var1 >> var2 >> var3
为: file.operator>>(var1).operator>>(var2).operator(var3)
basic_istream::operator>>(int&)
的返回值是basic_istream&
因此提取操作符可以在返回时重复调用,因为它返回了对自身的引用。
当您将其评估为: while(file >> var1 >> var2 >> var3)
,编译器实际上正在执行: while(file.operator>>(var1).operator>>(var2).operator(var3).operator bool())
我们可以看到basic_stream
提供了operator bool()
,这将作为while
循环的条件进行评估。 和operator bool()
:
如果流没有错误并且可以进行I / O操作,则返回
true
。 具体来说,返回!fail()
。
因此,这一行的可读解释是:“将var1
, var2
和var3
插入file
。如果插入没有失败,则继续循环。”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.