c++ buffer

Iniciado por user-marcos, 6 Marzo 2015, 21:30 PM

0 Miembros y 1 Visitante están viendo este tema.

user-marcos

Hola, estoy haciendo un programa de consola en c++, el cuerpo del programa tiene un menú switch donde dirige a los distintos módulos, resulta que 1 de cada 50 veces donde se pide la entrada del
menú, entra un valor basura, y el valor introducido pasa como entrada del siguiente cin>>.
supongo que esto se debe al buffer, he puesto el l_Buffer() antes del cin>> del menú, pero como en las otras 49 veces no tiene valor basura, el programa se queda en bucle.
¿Hay alguna manera de controlar si el buffer tiene algún valor para eliminarlo?

Un saludo.

void l_Buffer()
{
    while(cin.get() != '\n');
}

ivancea96

No tengo constancia de valores basura usando cin, sin más. ¿Qué método usas para leer con cin?

user-marcos

Cita de: ivancea96 en  6 Marzo 2015, 21:42 PM
No tengo constancia de valores basura usando cin, sin más. ¿Qué método usas para leer con cin?

Uso esto getline(cin, name, '\n');
Tampoco estoy convencido que la culpa sea del buffer, pero no se me ocurre otra cosa.

ivancea96

No ha de haber ningún problema. Ponme un ejemplod e un código que te de problema, y lo miro.

user-marcos

Cita de: ivancea96 en  6 Marzo 2015, 22:01 PM
No ha de haber ningún problema. Ponme un ejemplod e un código que te de problema, y lo miro.
El ejercicio es una práctica de clase, no puedo poner el código, porqué cuando lo subimos para hacer las correcciones tienen detector de plagio, si quieres te lo paso por privado con el autocorrector.

ivancea96

Me basta con que simules la situación con otro código :o
Solo es para ver por qué da ese fallo.

marlboreano

Hola user-marcos.
Fijate si en el código leen alguna línea con el operador de redirección de flujo >> y LUEGO con getline. De ser así, deberías utilizar "cin.ignore()" luego de cada lectura con cin, para que no te de más problemas (cin lee caracter a caracter, también los caracteres de fin de línea y demás, lo deja en el buffer de entrada y se lo come la funcion getline).