C++ как работает While (cin> x)?

мой вопрос в том, как делает,

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 как объект. Я просто хотите скопировать один действительно хороший кусок.

Edit: я использую Visual Studio 2010 (что становится настоящей болью), и мне понадобится что-то совместимое с его реализацией C++03 + some c++11.

2 ответов


теперь не могли бы вы написать пример того, как я могу это сделать с вышеуказанными вещами?

такой:

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

}

из документации здесь похоже, что оператор >> возвращает & istream. Означает ли это, что если чтение завершается неудачно или попадает в конец файла, он не только устанавливает eofbit, failbit или badbit, но и возвращает null?

нет, возвращается ссылка на объект stream, но будут установлены внутренние флаги. Последующие вызовы operator>> потерпит неудачу после тестирования этих флагов.

есть ли какая-то неявная проверка eofbit?

не уверен, в чем вопрос. Поток не будет пытаться узнать заранее, будет ли следующий запрос завершаться ошибкой, а только установить флаг, если одна операция завершилась неудачно, потому что она попала в EOF. Каждый вызов operator>> сначала проверить состояние потока, и если поток находится в хорошем состоянии.

как while(cin>>x) работы?

существует неявное преобразование из объекта stream в логическое значение. Доходность преобразования true если поток находится в хорошем состоянии или false иначе.