C++:我不明白循环是如何工作的
C++: I don't understand how this while loop works
我正在查看这里的一些问题,这些问题向您展示了如何从文本文件中读取,然后将其中的任何内容分配给单独的变量。答案是使用一个像这样的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++:从文本文件中读取并分离到变量
中谢谢!
基本上,"expression"(a) file >> var1 >> var2 >> var3
将尝试从file
流中读取三个值并将它们放入指定的变量中。它基本上与cin >> myVar
本身没有什么不同(除了它将输入链接到多个变量)。
整个表达式的值当且仅当三个值都被成功读取时为真。
在这种情况下,循环体将执行,三个值将被打印出来,循环将返回顶部并尝试获取下三个值。
当表达式的计算结果为false时(即没有读取三个值),循环将停止。
(a)从someStream >> someVariable
到布尔值的实际路径涉及流类中的几个步骤(从operator>>
的返回值与operator bool
转换为布尔值),但上述解释对于大多数用途应该足够好。
ifstream重载操作符>>。在您的特殊情况下,它是:
basic_istream& operator>>( int& value );
如你所见,返回对自身的引用,所以你可以重写:
while (file >> var1 >> var2 >> var3)
作为函数调用:
while (file.operator>>(var1).operator>>(var2).operator>>(var3))
另外ifstream显式转换为bool,如果流是ok则为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
循环的条件被求值。And operator bool()
:
返回
true
,如果流没有错误并且准备好进行I/O操作。具体来说,返回!fail()
。
因此,这一行的人类可读解释是:"将var1
, var2
和var3
插入file
。如果插入没有失败,继续循环。"
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?