¿Por qué deberíamos llamar a cin.clear () y cin.ignore () después de leer la entrada?

El tutorial de C ++ de Google Code University solía tener este código:

// Description: Illustrate the use of cin to get input // and how to recover from errors. #include  using namespace std; int main() { int input_var = 0; // Enter the do while loop and stay there until either // a non-numeric is entered, or -1 is entered. Note that // cin will accept any integer, 4, 40, 400, etc. do { cout <> input_var)) { cout << "Please enter numbers only." << endl; cin.clear(); cin.ignore(10000,'\n'); } if (input_var != -1) { cout << "You entered " << input_var << endl; } } while (input_var != -1); cout << "All done." << endl; return 0; } 

¿Cuál es el significado de cin.clear() y cin.ignore() ? ¿Por qué son necesarios los parámetros 10000 y \n ?

El cin.clear() borra el indicador de error en cin (para que las futuras operaciones de E / S funcionen correctamente), y luego cin.ignore(10000, '\n') salta a la siguiente nueva línea (para ignorar cualquier otra cosa en el misma línea que el no número para que no cause otra falla de análisis sintáctico). Solo saltará hasta 10000 caracteres, por lo que el código asume que el usuario no pondrá una línea muy larga e inválida.

Usted ingresa al

 if (!(cin >> input_var)) 

statement si se produce un error al tomar la entrada de cin. Si se produce un error, se establece un indicador de error y fallarán los bashs futuros de obtener entrada. Es por eso que necesitas

 cin.clear(); 

para deshacerse de la bandera de error. Además, la entrada que falló se sentará en lo que supongo que es una especie de amortiguador. Cuando intente ingresar de nuevo, leerá la misma entrada en el búfer y fallará nuevamente. Es por eso que necesitas

 cin.ignore(10000,'\n'); 

Saca 10000 caracteres del búfer pero se detiene si encuentra una nueva línea (\ n). El 10000 es solo un gran valor genérico.

utilice cin.ignore(1000,'\n') para borrar todos los caracteres del cin.get() en el búfer y elegirá detenerse cuando se encuentre primero con ‘\ n’ o con 1000 chars .