¿Cómo borro el búfer cin en C++?
¿Cómo descargo el búfer cin?
martín york
Preferiría las restricciones de tamaño de C++ sobre las versiones de C:
// Ignore to the end of file
std::cin.ignore(std::numeric_limits<std::streamsize>::max())
// Ignore to the end of line
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
-
Más importante aún, ¡los valores pueden ser diferentes! (streamsize no tiene que ser int)
– Roger Paté
16 de noviembre de 2009 a las 20:35
-
¿podría citar un ejemplo en el que debemos ignorar hasta el final del archivo porque si uso
cin
y use la primera declaración anterior para vaciar elcin
búfer, luego sigue solicitando entrada hasta que ingreseEOF
presionandoctrl+d
?– ajay
19/10/2013 a las 19:39
-
@ajay: No. Eso es algo que tendrás que decidir. Simplemente estoy explicando lo que hará lo anterior.
– Martín York
20 de octubre de 2013 a las 0:52
Evan Terán
Posiblemente:
std::cin.ignore(INT_MAX);
Esto leería e ignoraría todo hasta que EOF
. (también puede proporcionar un segundo argumento que es el carácter para leer hasta (por ejemplo: '\n'
para ignorar una sola línea).
También: Probablemente quieras hacer un: std::cin.clear();
antes de esto también para restablecer el estado de la transmisión.
-
Borre antes, en lugar de después, para que la secuencia se ponga en un buen estado donde pueda operar en su búfer.
– GManNickG
3 oct 2010 a las 10:33
-
Solo quería señalar que para mi caso, encuentro necesario el ‘\n’. De lo contrario, el “cin >>” posterior no funciona.
– Cardín
21 de noviembre de 2013 a las 9:39
-
Para mí, esto se detiene hasta que encuentra al menos tantos caracteres como el argumento (compilador de Microsoft)
– Nic
23 de agosto de 2016 a las 19:05
-
@Nic: por supuesto, esto le dice al código que ignore TODOS los caracteres hasta la cantidad especificada. En el ejemplo principal, ignorará esencialmente hasta que
EOF
(porqueINT_MAX
es enorme). Como se menciona en la publicación, si solo desea ignorar una sola línea, debe especificar un parámetro adicional de'\n
para decirle que solo desea ignorar hasta el final de la línea.– Evan Terán
23 de agosto de 2016 a las 20:08
-
Si hace esto la próxima vez que llame a getline (cin, input), puede presionar un carácter seguido de enter durante todo el día, no funcionará.
– usuario3015682
23 mayo 2019 a las 19:39
jyggorath
cin.clear();
fflush(stdin);
Esto fue lo único que funcionó para mí al leer desde la consola. En todos los demás casos, se leería indefinidamente debido a la falta de \n o algo permanecería 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');
}
-
sí, no use fflush en stdin (o cualquier transmisión que esté abierta para lectura) es un comportamiento indefinido
– WENDYN
30 de julio de 2021 a las 18:54
ben
He encontrado dos soluciones a esto.
La primera, y más sencilla, es utilizar std::getline()
por ejemplo:
std::getline(std::cin, yourString);
… eso descartará el flujo de entrada cuando llegue a una nueva línea. Leer 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";
martín york
Qué tal si:
cin.ignore(cin.rdbuf()->in_avail());
Comunidad
Yo prefiero:
cin.clear();
fflush(stdin);
Hay un ejemplo en el que cin.ignore simplemente no funciona, pero no puedo pensar en eso en este momento. Fue hace un tiempo cuando necesité usarlo (con Mingw).
Sin embargo, fflush(stdin) es un comportamiento indefinido según el estándar. fflush() solo está destinado a flujos de salida. fflush (stdin) solo parece funcionar como se esperaba en Windows (al menos con los compiladores GCC y MS) como una extensión del estándar C.
Entonces, si lo usa, su código no será portátil.
Consulte Uso de fflush(stdin).
Ver también http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 por una alternativa.
-
fflush(entrada estándar); es Comportamiento indefinido (en el lenguaje de programación C), declarado explícitamente en 7.18.5.2/2
– Cubbi
15 de enero de 2011 a las 5:48
-
+1 por proporcionar un kludge válido y funcional. Algunas personas tienen trabajos, otras tienen estándares.
– Mijaíl
27 de julio de 2012 a las 16:18
-
@Mikhail: su trabajo debe incluir la escritura de código compatible con el estándar. Me aseguraré de evitar usar cualquier cosa que hayas escrito en el futuro.
– Ed S.
04/01/2013 a las 21:46