Forma correcta de usar cin.fail ()

Cuál es la forma correcta de usar cin.fail(); ?

Estoy haciendo un progtwig donde necesitas ingresar algo. No está muy claro si necesita ingresar un número o personaje. Cuando un usuario ingresa un personaje en lugar de un número, la consola se vuelve loca. ¿Cómo puedo usar cin.fail() para arreglar esto?

¿O hay un mejor camino?

cin.fail() devuelve verdadero si falló el último comando cin, y de lo contrario es falso.

Un ejemplo

 int main() { int i, j = 0; while (1) { i++; cin >> j; if (cin.fail()) return 0; cout << "Integer " << i << ": " << j << endl; } } 

Ahora supongamos que tiene un archivo de texto - input.txt y sus contenidos son:

  30 40 50 60 70 -100 Fred 99 88 77 66 

Cuando ejecutará el progtwig corto sobre eso, resultará así:

  Integer 1: 30 Integer 2: 40 Integer 3: 50 Integer 4: 60 Integer 5: 70 Integer 6: -100 

no continuará después del valor 6 cuando se cierra después de leer la séptima palabra , porque ese no es un número entero: cin.fail() es true .

std::cin.fail() se usa para probar si la entrada anterior tuvo éxito. Sin embargo, es más idiomático usar la transmisión como si fuera un booleano:

 if ( std::cin ) { // last input succeeded, ie !std::cin.fail() } if ( !std::cin ) { // last input failed, ie std::cin.fail() } 

En contextos donde la syntax de la entrada permite un número de caracteres, la solución habitual es leerlo por líneas (o en alguna otra forma de cadena), y analizarlo; cuando detecta que hay un número, puede usar std::istringstream para convertirlo, o cualquier cantidad de otras alternativas ( strtol , o std::stoi si tiene C ++ 11).

Sin embargo, es posible extraer los datos directamente de la secuencia:

 bool isNumeric; std::string stringValue; double numericValue; if ( std::cin >> numericValue ) { isNumeric = true; } else { isNumeric = false; std::cin.clear(); if ( !(std::cin >> stringValue) ) { // Shouldn't get here. } }