C ++ While(cin>> x)是如何工作的?

时间:2012-10-16 21:32:48

标签: c++ operators cin istream

我的问题是怎么做,

while(cin>>x)
{
     //code
}

的工作。或者更具体地说,那个代码会停止循环?

从文档here,它看起来像>>运算符返回&istream。这是否意味着如果读取失败或命中文件末尾它不仅设置eofbit,failbit或badbit而且还返回null?这真的没有意义,所以我怀疑是这样。

是否存在某种对eofbit的隐式检查?

我问,因为我希望用类似的2个类来实现类似的东西,

class B
{
   //variables and methods
}

class A
{
   //Variables and methods
   //Container of B objects. ex. B[] or vector<B> or Map<key,B>
   &A >> (B b);
}

int main()
{
   A a;
   B b;

   while( a >> b)
   {
      //Code
   }

}

注意:我不打算继承istream,除非这是让这项工作的魔力来自哪里。这样做的原因是我希望保持类及其依赖关系尽可能小。如果我从istream继承,我将收到所有公共和受保护的内容,而我不是要创建一个istream类似的对象。我只想复制一个真的好的部分。

编辑:我正在使用Visual Studio 2010(这变得非常痛苦)我将需要一些兼容它的C ++ 03 + C ++的实现11。

2 个答案:

答案 0 :(得分:5)

  

从这里的文档看起来像&gt;&gt;运算符返回&amp; istream。这是否意味着如果读取失败或命中文件末尾它不仅设置eofbit,failbit或badbit而且还返回null?

不,返回对流对象的引用,但将设置内部标志。在测试这些标志后,对operator>>的后续调用将失败。

  

是否存在某种对eofbit的隐式检查?

不确定问题是什么。流不会尝试预先查找下一个请求是否会失败,而是仅在一个操作失败时设置该标志,因为它命中了EOF。每次调用operator>>都将首先测试流的状态,并且只有在流状况良好时才会继续。

  

while(cin>>x)如何运作?

存在从流对象到布尔值的隐式转换。如果流状况良好,则转换结果为true,否则为false

答案 1 :(得分:4)

  

现在你能写一个例子,说明如何用上述内容做到这一点吗?

像这样:

// UNTESTED
class B
{
   //variables and methods
}

class A
{
   bool still_good;

   //Variables and methods
   //Container of B objects. ex. B[] or vector<B> or Map<key,B>
   A& operator>>(B& b) {
     try_to_fill_b();
     if(fail) still_good = false;
     return *this;
   }
   explicit operator bool() { return still_good; }
}

int main()
{
   A a;
   B b;

   while( a >> b)
   {
      //Code
   }

}