【问题标题】:C++: I don't understand how this while loop worksC++:我不明白这个while循环是如何工作的
【发布时间】:2016-10-27 02:06:02
【问题描述】:

我在这里查看了一些问题,这些问题向您展示了如何从 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

谢谢!

【问题讨论】:

  • 我想你可以得到一些澄清here
  • 你问的是文件结束检测还是“操作符链”?使用&lt;&lt;

标签: c++ while-loop ifstream


【解决方案1】:

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

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

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

在表达式计算结果为假(即未读取三个值)时,循环将停止。


(a)someStream &gt;&gt; someVariable 到布尔值的实际路径涉及流类中的几个步骤(operator&gt;&gt; 的返回值被转换为一个带有operator bool 的布尔值),但上面的解释对于大多数用途来说应该足够了。

【讨论】:

  • 这不完全是“表达式的值”。当您编写while (file &gt;&gt; var) 时,它会被解析为while(operator&gt;&gt;(file, var))。现在operator&gt;&gt;(ifstream&amp;, int) 返回一个ifstream &amp;,它有一个explicit operator bool(),允许它在while 循环保护中进行测试(上下文转换为布尔值)。
  • @peppe,这是while 语句上下文中的一个表达式,我不确定我们是否需要深入了解这个基本上是初学者的问题。我会澄清一下,但不会增加太多复杂性。
【解决方案2】:

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

basic_istream& operator>>( int& value );

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

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

作为函数调用:

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

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

bool b = file; // results in error

【讨论】:

    【解决方案3】:

    编译器会将:file &gt;&gt; var1 &gt;&gt; var2 &gt;&gt; var3 翻译为:file.operator&gt;&gt;(var1).operator&gt;&gt;(var2).operator(var3)

    basic_istream::operator&gt;&gt;(int&amp;) 的返回是 basic_istream&amp;,因此提取运算符可以在返回时重复调用,因为它返回对自身的引用。

    当您像这样评估它时:while(file &gt;&gt; var1 &gt;&gt; var2 &gt;&gt; var3) 编译器确实在做:while(file.operator&gt;&gt;(var1).operator&gt;&gt;(var2).operator(var3).operator bool()) 我们可以看到basic_stream 提供了operator bool() 所以这将是评估为while 循环的条件.还有operator bool()

    如果流没有错误并且准备好进行 I/O 操作,则返回 true。具体来说,返回!fail()

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

    【讨论】:

      猜你喜欢
      • 2017-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-16
      • 1970-01-01
      • 1970-01-01
      • 2015-03-25
      • 1970-01-01
      相关资源
      最近更新 更多