2014-04-29 3 views
0
#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <stdexcept> 
using namespace std; 
int main() 
{ 
    int ival; 
    while(cin >> ival, !cin.eof()) 
    { 
     if(cin.bad()) 
      throw runtime_error("IO stream corrupted"); 
     if(cin.fail()) 
     { 
      cerr<< "bad data,try again"<<endl; 
      cin.clear(istream::failbit); 
      continue; 
     } 
    } 
} 

Мой английский плохой и извинился за это. после компиляции этого кода и запуска его, ввода и «а» в консоли, и он находится в мертвом цикле, я не могу ввести в него другой алфавит? Кто может сказать мне, что случилось?C++ iostream iostate

ответ

3

Проблема в том, что std::basic_ios::clear фактически не ясно бит, который вы предоставляете. Он устанавливает биты, которые вы предоставляете.

0

две проблемы:

  1. Как описано в http://en.cppreference.com/w/cpp/io/basic_ios/clearstd::basic_ios::clear не очищает бит вы предоставляете, он устанавливает его. Таким образом, вам необходимо установить goodbit.

  2. Вам нужно промыть поток, чтобы предотвратить перевод строки портить ваш цикл

Это должно работать в запланированном пути

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <stdexcept> 
#include <limits> 
using namespace std; 
int main() 
{ 
    int ival; 
    while(cin >> ival, !cin.eof()) 
    { 
    cout<< cin.rdstate()<<endl; 
    if(cin.bad()) 
     throw runtime_error("IO stream corrupted"); 
    if(cin.fail()) 
    { 
     cout<< "bad data,try again"<<endl; 
     cin.clear(istream::goodbit); // Set the goodbit 
     cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n'); 
     continue; 
    } 
    } 
} 

http://ideone.com/enFBjA

+0

спасибо большое, я думаю, мне нужно google "cin.ignore ......", чтобы понять, что это значит ~, еще раз спасибо – Thompson

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