8

我的问题是如何,

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

工作。或者更具体地说,该代码会停止循环怎么办?

这里的文档中,看起来 >> 运算符返回一个&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 的实现兼容的东西。

4

2 回答 2

5

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

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

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

不知道问题是什么。流不会尝试预先确定下一个请求是否会失败,而只会在一个操作因遇到 EOF 而失败时设置标志。每次调用operator>>都会首先测试流的状态,并且只有在流处于良好状态时才会继续。

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

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

于 2012-10-16T21:40:14.570 回答
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
   }

}
于 2012-10-16T21:44:37.783 回答