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循环的条件如何返回一个布尔值。但我很困惑如何分配commandvalue变量。 正在读取的文件是这样的:

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,无论它们是否映射到变量?

+2

请详细说明是你所期待的事情发生,以及如何从什么是真正的区别发生了。 –

+0

[无法重现](https://ideone.com/pXyRd0)。 –

如果你看一看的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是否仍有要读取的数据。

+1

优秀的解释。仍然适应C++及其密集的语法。有时我迷失在文档中寻找什么。谢谢! – user1070725

该循环会越过文件的第一行。只要读取了任何字符,条件是否返回true,无论它们是否映射到变量?

否 - 一旦解析变量失败,您将得到falseinf >> command >> value代码可以将inf设置为fail状态,之后转换为布尔值将导致while循环终止。 fail表示无法解析输入字符以形成请求类型的值。

默认情况下,istream及其衍生物使用>>时跳过的空白,所以>> command方面请求下一个非空白字符:任何这样的字符将被接受。 >> value虽然不同,但它只有在遇到的值可以被解析为数字时才会成功:它可以选择以-+开头,它必须至少有一个数字('0'-'9'),但不会超过目标类型的范围。

如果输入包含像说i1E6,将被解析为commandi,其次是commandEvalue1, E`不引入电源的十一个指数它为浮动方式点数。

只会报告value这个点上没有一个数字的错误。您可以通过拒绝其他commandi值改善这一点,并说erd擦除,移动或删除....