2012-06-28 20 views
6

Tengo una pregunta que es ligeramente similar a esta pregunta en stackoverflow std::cin.clear() fails to restore input stream in a good state, pero la respuesta proporcionada allí no funciona para mí.Restablecer el estado de un flujo

La pregunta es: ¿cómo puedo restablecer el estado de una secuencia a 'bueno' otra vez?

Aquí está mi código de cómo lo intento, pero el estado nunca vuelve a ser bueno. Usé ambas líneas ignorar por separado.

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

Respuesta

11

El código aquí

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

en realidad no borrar la failbit, que reemplaza el estado actual de la corriente con failbit.

Para borrar todos los bits, simplemente llame al clear().


La descripción en el estándar es un poco complicado, indicado como el resultado de otras funciones

void clear(iostate state = goodbit);

posterior: Si rdbuf()!=0 entonces state == rdstate(); lo contrario rdstate()==(state | ios_base::badbit).

que básicamente significa que la siguiente llamada a rdstate() devolverá el valor pasado a clear(). Excepto cuando hay otros problemas, en cuyo caso puede obtener un badbit también.

Además, goodbit en realidad no es para nada un poco, pero tiene el valor cero para borrar todos los demás bits.

Para borrar simplemente el bit específico, puede utilizar esta llamada

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

Sin embargo, si desactiva una bandera y que quedan otros, todavía no se puede leer de la corriente. Entonces este uso es bastante limitado.

+0

En mi libro dice: clear (flag) establece el estado de condición especificado como válido. Lo interpreté como: borra el bit de error especificado. Esto es incorrecto entonces? – physicalattraction

+0

Es simplemente 'clear()' borrar las banderas * all *. Borrar un solo indicador es un poco más complicado (y no demasiado útil). He agregado una nueva parte a mi respuesta. –

Cuestiones relacionadas