2012-06-28 2 views
6

У меня есть вопрос, который немного похож на этот вопрос на stackoverflow std::cin.clear() fails to restore input stream in a good state, но предоставленный там ответ не работает для меня.Сброс состояния потока

Вопрос в следующем: как я могу снова сбросить состояние потока до «хорошего»?

Вот мой код, как я его пробовал, но состояние никогда не будет настроено на хорошее. Я использовал обе строки отдельно.

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int result; 
    while (std::cin.good()) 
    { 
     std::cout << "Choose a number: "; 
     std::cin >> result; 

     // Check if input is valid 
     if (std::cin.bad()) 
     { 
      throw std::runtime_error("IO stream corrupted"); 
     } 
     else if (std::cin.fail()) 
     { 
      std::cerr << "Invalid input: input must be a number." << std::endl; 
      std::cin.clear(std::istream::failbit); 
      std::cin.ignore(); 
      std::cin.ignore(INT_MAX,'\n'); 
      continue; 
     } 
     else 
     { 
      std::cout << "You input the number: " << result << std::endl; 
     } 
    } 
    return 0; 
} 

ответ

11

Код здесь

std::cin.clear(std::istream::failbit); 

на самом деле не ясно failbit, он заменяет текущее состояние потока с failbit.

Чтобы очистить все биты, просто позвоните clear().


описание в стандарте немного запутанным, указано в результате других функций

void clear(iostate state = goodbit);

Постусловие: Если rdbuf()!=0 затем state == rdstate(); иначе rdstate()==(state | ios_base::badbit).

Который в основном означает, что следующий вызов rdstate() возвратит значение, передаваемое в clear(). За исключением случаев, когда есть другие проблемы, в этом случае вы также можете получить badbit.

Кроме того, goodbit фактически совсем не бит, но имеет значение 0, чтобы очистить все остальные биты.

Чтобы очистить только на один конкретный бит, вы можете использовать этот вызов

cin.clear(cin.rdstate() & ~ios::failbit); 

Однако, если вы ясно один флаг и другие остаются, по-прежнему не может читать из потока. Поэтому это использование довольно ограничено.

+0

В моей книге говорится: clear (flag) устанавливает указанное состояние условия в действительное. Я интерпретировал это как: очищает указанный бит ошибки. Это неверно? – physicalattraction

+0

Это просто 'clear()' очистить * все * флаги. Очистить один флаг немного сложнее (и не слишком полезно). Я добавил новую часть к моему ответу. –

 Смежные вопросы

  • Нет связанных вопросов^_^