¿Cómo borro el buffer cin en C++?¿Cómo purgo el buffer cin?
Respuesta
Posiblemente:
std::cin.ignore(INT_MAX);
Este sería el siguiente en e ignorar todo hasta el EOF
. (También se puede suministrar un segundo argumento que es el carácter de leer hasta que (por ejemplo: '\n'
ignorar una sola línea)
también:. Es posible que desee hacer un:. std::cin.clear();
antes de esto también a restablecer el estado de flujo de
El siguiente debería funcionar:
cin.flush();
En algunos sistemas que no está disponible y luego se puede utilizar:
cin.ignore(INT_MAX);
por qué escribir manualmente un bucle cuando se puede decir ignorar los caracteres INT_MAX leídos hasta que llega a EOF (el valor predeterminado del segundo parámetro). –
Tienes razón :) –
Gunnar, podría ser mejor editar tu publicación para reflejar esto, por las dudas. –
yo preferiría las limitaciones de tamaño de 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')
¡Más importante aún, los valores pueden ser diferentes! (streamsize no tiene que ser int) –
podría citar un ejemplo donde tenemos que ignorar hasta el final del archivo porque si uso 'cin' y uso la primera instrucción de arriba para eliminar el búfer' cin', entonces sigue pidiendo entradas hasta que ingrese 'EOF' presionando' ctrl + d'? – ajay
@ajay: No. Eso es algo que tendrás que decidir. Simplemente estoy explicando lo que hará lo anterior. –
prefiero:
cin.clear();
fflush(stdin);
Hay un examen donde 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 la norma. fflush() solo está destinado a las transmisiones de salida. fflush (stdin) solo parece funcionar como se esperaba en Windows (con los compiladores GCC y MS al menos) as an extension to the C standard.
Por lo tanto, si lo usa, su código no será portátil.
Ver Using fflush(stdin).
También, vea http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 para una alternativa.
fflush (stdin); es Undefined Behavior (en el lenguaje de programación C), explícitamente así en 7.18.5.2/2 – Cubbi
+1 para suministrar un kludge de trabajo válido. Algunas personas tienen trabajos que otros tienen estándares. – Mikhail
@Mikhail: su trabajo debe incluir la escritura de código estándar compatible. Me aseguraré de evitar usar cualquier cosa que hayas escrito en el futuro. –
¿Qué tal:
cin.ignore(cin.rdbuf()->in_avail());
la función in_avail() del streambuf no es confiable, y muchas implementaciones simplemente devuelven cero. Ver: https://connect.microsoft.com/VisualStudio/feedback/details/509337/vc-8-9-sstream-basic-streambuf-sputc-sputn-dont-increment-gcount gnu's libC++ es similar –
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";
cin.clear();
fflush(stdin);
Este fue el único que trabajó para mí al leer de 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. Éste sin embargo, funciona:
cin.getline(temp, STRLEN);
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
#include <stdio_ext.h>
y luego usar la función
__fpurge(stdin)
cin.get()
parece tirar de la cadena de forma automática por extraño que parezca (probablemente no se prefiere, sin embargo, ya que esto es confuso y probablemente temperamental).
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 este fue práctico.
loop infinito para mí. – StarWind0
Está funcionando solo si hay un final de línea; de lo contrario, un bucle infinito –
He encontrado dos soluciones para esto.
La primera, y más simple, es el uso de std::getline()
por ejemplo:
std::getline(std::cin, yourString);
... que se deseche el flujo de entrada cuando se llega a una nueva línea. Obtenga más información acerca de esta función here.
Otra opción que descarta directamente la corriente es esto ...
#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 sitúa el puntero cin al final del flujo de entrada estándar y cin.clear() limpia todos los indicadores de error tales como la bandera EOF.
- 1. C++: ¿cómo puedo verificar si el buffer cin está vacío?
- 2. Inyectando cadena a 'cin'
- 3. cin.clear() no restablece el objeto cin
- 4. Cómo vaciar el buffer io en Erlang?
- 5. Cómo hacer cin tomar sólo números
- 6. Cómo usar Cin Space en C++?
- 7. Java equivalente de cin (C++)
- 8. lectura 'unsigned int' usando 'cin'
- 9. C++ cout y cin buffers, y buffers en general
- 10. Uso de cin en QtCreator
- 11. ¿Es seguro sprintf (buffer, "% s [...]", buffer, [...])?
- 12. Redirigir cin a una cadena
- 13. std :: cin.getline() vs. std :: cin
- 14. strcpy cuando el buffer de dest es más pequeño que el buffer de src
- 15. ¿Cómo maneja el buffer de protocolo el control de versiones?
- 16. ¿Cómo purgo la salida al archivo después de cada escritura con un programa Fortfort 90?
- 17. C++ cin char leer símbolo por símbolo
- 18. Comando Emacs mini-buffer con el parámetro
- 19. lectura una contraseña de std :: cin
- 20. Obteniendo las teclas de flecha de cin
- 21. ¿Es posible usar cin con Qt?
- 22. antialiasing OpenGL sin el buffer de acumulación
- 23. ¿Quién es el buffer setvbuf de free?
- 24. Encuentra el final de la corriente para cin & ifstream?
- 25. ¿Cómo puedo cin y cout algún texto Unicode?
- 26. ¿Cómo arreglar el buffer en una ventana en vim?
- 27. Android - Cómo saber cuándo MediaPlayer está almacenando en el buffer
- 28. Cómo vaciar (borrar) el buffer de logcat en Android
- 29. Protocolo Buffer: cómo definir el tipo de fecha?
- 30. ¿Cómo suprimo el buffer de salida de python-mode?
(Viejo lo sé). Despeje antes, más bien, para que la transmisión se ponga en un buen estado donde pueda operar en su memoria intermedia. – GManNickG
Gracias, GMan! Lo hice de la manera incorrecta, primero, y pasé bastante tiempo buscando mi error. – balu
@GManNickG, acaba de arreglar la respuesta. – bwDraco