¿Cómo borro el búfer cin en C ++?
¿Cómo borro el búfer cin en C ++?
Respuestas:
Posiblemente:
std::cin.ignore(INT_MAX);
Esto leería e ignoraría todo hasta EOF
. (también puede proporcionar un segundo argumento que es el carácter a leer 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 transmisión.
Preferiría las restricciones de tamaño de C ++ sobre las versiones de 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')
cin
y uso la primera declaración anterior para vaciar el cin
búfer, sigue solicitando la entrada hasta que ingrese EOF
presionando ctrl+d
?
cin.clear();
fflush(stdin);
Esto fue lo único que funcionó para mí al leer desde la consola. En cualquier otro caso, se leería indefinidamente debido a la falta de \ n, o quedaría algo en el búfer.
EDITAR: Descubrí que la solución anterior empeoró las cosas. ESTE sin embargo, funciona:
cin.getline(temp, STRLEN);
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
He encontrado dos soluciones para esto.
La primera, y la más sencilla, es utilizar, std::getline()
por ejemplo:
std::getline(std::cin, yourString);
... que descartará el flujo de entrada cuando llegue a una nueva línea. Lea más sobre esta función aquí .
Otra opción que descarta directamente el stream es esta ...
#include <limits>
// Possibly some other code here
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
¡Buena suerte!
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";
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 funciona, pero no puedo pensar en ello en este momento. Fue hace un tiempo cuando necesitaba usarlo (con Mingw).
Sin embargo, fflush (stdin) es un comportamiento indefinido según el estándar. fflush () solo está diseñado para flujos de salida. fflush (stdin) solo parece funcionar como se esperaba en Windows (con 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.
Otra posible solución (manual) es
cin.clear();
while (cin.get() != '\n')
{
continue;
}
No puedo usar fflush o cin.flush () con CLion, por lo que esto fue útil.
La manera más fácil:
cin.seekg(0,ios::end);
cin.clear();
Simplemente coloca el puntero cin al final del flujo 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);
flush
método es solo para salida y trata con caracteres ya escritos.
basic_istream<char>' has no member named 'flush'
cin.get()
parece vaciarlo automáticamente de manera bastante extraña (probablemente no sea el preferido, ya que esto es confuso y probablemente temperamental).
Funcionó para mí. He usado for loop con getline ().
cin.ignore()