我在这里看了一些问题,向您展示如何从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
谢谢!
答案 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()
。
因此,此行的人类可读解释是:“将var1
,var2
和var3
插入file
。如果插入没有失败,请继续循环。“