C ++:我不明白这个while循环是如何工作的

时间:2016-06-24 12:36:55

标签: c++ while-loop ifstream

我在这里看了一些问题,向您展示如何从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++: Read from text file and separate into variable

谢谢!

3 个答案:

答案 0 :(得分:3)

基本上,&#34;表达式&#34; (a) file >> var1 >> var2 >> var3将尝试从file流中读取三个值并将它们放入指定的变量中。它与cin >> myVar基本上没有什么不同(除了它将输入引导到多个变量)。

当且仅当成功读取所有三个值时,整个表达式的才为真。

在这种情况下,循环体将执行,三个值将被打印出来,循环将返回到顶部并尝试获取接下来的三个值。

在表达式求值为false的位置(即,未读取三个值),循环将停止。

(a)someStream >> someVariable到布尔值的实际路径涉及流类中的几个步骤({{1}的返回值使用operator>>转换为布尔值,但上述解释对于大多数用途应该足够好。

答案 1 :(得分:1)

ifstream重载operator>>。在您的特定情况下,它是:

basic_istream& operator>>( int& value );

如你所见,它会返回对自身的引用,因此你可以重写:

 while (file >> var1 >> var2 >> var3)

作为函数调用:

while (file.operator>>(var1).operator>>(var2).operator>>(var3))

另外ifstream显式转换为bool,如果stream是ok则给出true,否则为false。此转换使用operator bool完成,标记为explicit(C ++ 11及更高版本)。应用于转换运算符的此说明符允许在ifstream循环或while语句中使用if实例,但它不允许您将其分配给bool变量:

bool b = file; // results in error

答案 2 :(得分:1)

编译器会将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()

因此,此行的人类可读解释是:“将var1var2var3插入file。如果插入没有失败,请继续循环。“