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

Dan*_*Dan 8 c++ operators cin istream

我的问题是怎么做

while(cin>>x)
{
     //code
}
Run Code Online (Sandbox Code Playgroud)

工作.或者更具体地说,那段代码会停止循环?

这里的文档中,它看起来像>>运算符返回一个&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
   }

}
Run Code Online (Sandbox Code Playgroud)

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

编辑:我正在使用Visual Studio 2010(这正在成为一个真正的痛苦),我将需要与它的C++ 03 +一些C++ 11的实现兼容的东西.

Dav*_*eas 5

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

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

有没有对eofbit进行某种隐式检查?

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

while(cin>>x)工作怎么样?

存在从流对象到布尔值的隐式转换.true如果流处于良好状态或false其他情况,则转换产生.


Rob*_*obᵩ 5

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

像这样:

// 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
   }

}
Run Code Online (Sandbox Code Playgroud)