c++ cin io-buffering

c++ - ¿Cómo descargo el buffer cin?



clear buffer c (12)

¿Cómo elimino el buffer cin en C ++?


He encontrado dos soluciones para esto.

El primero, y el más simple, es usar std::getline() por ejemplo:

std::getline(std::cin, yourString);

... que descartará la corriente de entrada cuando llegue a una nueva línea. Lea más sobre esta función here .

Otra opción que descarta directamente la transmisión es esta ...

#include <limits> // Possibly some other code here cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), ''/n'');

¡Buena suerte!


La manera más fácil:

cin.seekg(0,ios::end); cin.clear();

Simplemente coloca el puntero cin al final de la secuencia stdin y cin.clear () borra todos los indicadores de error, como el indicador EOF.


Lo siguiente debería funcionar:

cin.flush();

En algunos sistemas, no está disponible y luego puede usar:

cin.ignore(INT_MAX);


Otra posible solución (manual) es

cin.clear(); while (cin.get() != ''/n'') { continue; }

No puedo usar fflush o cin.flush () con CLion, así que esto fue útil.


Posiblemente:

std::cin.ignore(INT_MAX);

Esto se leería e ignoraría todo hasta EOF . (También puede proporcionar un segundo argumento que es el carácter que debe leerse hasta (por ejemplo: ''/n'' para ignorar una sola línea).

Además: probablemente desee hacer un: std::cin.clear(); antes de esto también para restablecer el estado de la corriente.


Preferiría las restricciones de tamaño C ++ sobre las versiones C:

// Ignore to the end of file cin.ignore(std::numeric_limits<std::streamsize>::max()) // Ignore to the end of line cin.ignore(std::numeric_limits<std::streamsize>::max(), ''/n'')


Qué tal si:

cin.ignore(cin.rdbuf()->in_avail());


Yo prefiero:

cin.clear(); fflush(stdin);

Hay un ejemplo en el que cin.ignore simplemente no lo corta, pero no puedo pensarlo en este momento. Fue hace un tiempo cuando necesitaba usarlo (con Mingw).

Sin embargo, fflush (stdin) es un comportamiento indefinido de acuerdo con el estándar. fflush () solo está destinado a las transmisiones de salida. fflush (stdin) solo parece funcionar como se espera en Windows (con los compiladores GCC y MS al menos) como una extensión del estándar C.

Entonces, si lo usa, su código no será portátil.

Consulte Uso de fflush (stdin) .

Además, consulte http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 para obtener una alternativa.


cin.get() parece enjuagarlo automáticamente de manera bastante extraña (aunque probablemente no lo prefiera, ya que esto es confuso y probablemente temperamental).


#include <stdio_ext.h>

y luego usar la función

__fpurge(stdin)


cin.clear(); fflush(stdin);

Esto fue lo único que funcionó para mí cuando leía desde la consola. En cualquier otro caso, leería indefinidamente debido a la falta de / n, o algo permanecería en el búfer.

EDIT: descubrí que la solución anterior empeoraba las cosas. ESTE sin embargo, funciona:

cin.getline(temp, STRLEN); if (cin.fail()) { cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), ''/n''); }


int i; cout << "Please enter an integer value: "; // cin >> i; leaves ''/n'' among possible other junk in the buffer. // ''/n'' also happens to be the default delim character for getline() below. cin >> i; if (cin.fail()) { cout << "/ncin failed - substituting: i=1;/n/n"; i = 1; } cin.clear(); cin.ignore(INT_MAX,''/n''); cout << "The value you entered is: " << i << " and its double is " << i*2 << "./n/n"; string myString; cout << "What''s your full name? (spaces inclded) /n"; getline (cin, myString); cout << "/nHello ''" << myString << "''./n/n/n";