while(std :: ifstream >> char >> int)是如何工作的? (再次)
我想了解while循环的工作原理如下:while(std :: ifstream >> char >> int)是如何工作的? (再次)
//...
ifstream inf(filename);
char command;
int value;
//...
while(inf >> command >> value)
{
if (command == 'i')
list.insert(value,listItr);
else
list.remove(value);
}
我读的答案,一个similar question和了解while循环的条件如何返回一个布尔值。但我很困惑如何分配command
和value
变量。 正在读取的文件是这样的:
Has a series of 250,000 insertions in order from 1 to 250000
i1 i2 i3 i4 i5 i6 i7 i8 i9 i10 i11 i12 i13 i14 i15 i16 i17 i18 i19 i20 i21 i22 i23 i24 i25...
我想读I1 + I2等。但是,循环获取过去文件的第一行,只有当while条件会成功。只要读取了任何字符,条件是否返回true,无论它们是否映射到变量?
如果你看一看的stream operator>>:
istream& operator>> (bool& val);
^^^^^^^^
istream& operator>> (short& val);
^^^^^^^^
...
你会看到它的所有版本返回istream&
。所以,一旦inf >> command
已经执行,产生的istream
将被用于读取数据到value
。这有点像运行inf >> command
,然后inf >> value
。
之后,你能够运行循环的原因很简单。上次阅读(inf >> value
)也会返回istream&
。并且istream
已执行bool operator。因此,您可以“自动”检查istream
是否仍有要读取的数据。
优秀的解释。仍然适应C++及其密集的语法。有时我迷失在文档中寻找什么。谢谢! – user1070725
该循环会越过文件的第一行。只要读取了任何字符,条件是否返回true,无论它们是否映射到变量?
否 - 一旦解析变量失败,您将得到false
。 inf >> command >> value
代码可以将inf
设置为fail
状态,之后转换为布尔值将导致while
循环终止。 fail
表示无法解析输入字符以形成请求类型的值。
默认情况下,istream
及其衍生物使用>>
时跳过的空白,所以>> command
方面请求下一个非空白字符:任何这样的字符将被接受。 >> value
虽然不同,但它只有在遇到的值可以被解析为数字时才会成功:它可以选择以-
或+
开头,它必须至少有一个数字('0'
-'9'
),但不会超过目标类型的范围。
如果输入包含像说i1E6
,将被解析为command
i
,其次是command
E
value
1
, E`不引入电源的十一个指数它为浮动方式点数。
只会报告value
这个点上没有一个数字的错误。您可以通过拒绝其他command
比i
值改善这一点,并说e
,r
或d
擦除,移动或删除....
请详细说明是你所期待的事情发生,以及如何从什么是真正的区别发生了。 –
[无法重现](https://ideone.com/pXyRd0)。 –