¿Cómo descargo el búfer cin?

5 minutos de lectura

¿Cómo borro el búfer cin en C++?

¿Como descargo el bufer 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 el cin búfer, luego sigue solicitando entrada hasta que ingrese EOF presionando ctrl+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

1647562087 386 ¿Como descargo el bufer cin
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 (porque INT_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

1647562088 697 ¿Como descargo el bufer cin
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

¿Como descargo el bufer cin
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";

¿Como descargo el bufer cin
martín york

Qué tal si:

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

1647562089 165 ¿Como descargo el bufer cin
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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad