[C con Clase] Duda sobre cin.getline

Steven Davidson srd4121 en njit.edu
Lun Abr 4 18:57:01 CEST 2011


Hola Pedro,

On 4/4/2011 9:35 AM, Pedro Osorio wrote:
> Despues de:
>     cout<<  "Ingresa tu opcion: ";
>     cin>>  opcion;
> Debes limpiar el buffer de entrada, pues el "intro" quedó almacenado
> allí. para limpiarlo debes añadir lo siguiente:
>     cout<<  "Ingresa tu opcion: ";
>     cin>>  opcion;
>     cin.clear();
>     fflush(stdin);
>
> Es una de las varias opciones que se ven por internet. Ma
> información acá:
> http://stackoverflow.com/questions/257091/how-do-i-flush-the-cin-buffer
>

Me temo que no estoy de acuerdo con esta forma. De hecho, en ese foro de 
preguntas y respuestas, ésta tiene un -1. La razón es que se mezclan dos 
formas diferentes de tratar el búfer del teclado: 'cin' que es de C++ y 
'fflush()' que originalmente es de C. No es NADA recomendable mezclar 
<iostream> con <cstdio>, porque es posible que no estén asociados. Es 
decir, 'cin' puede funcionar independientemente de las funciones de 
<cstdio> y viceversa.

En segundo lugar, 'fflush()' sirve exclusivamente para canales de 
salida, dictada por su diseño en el estándar. Ahora bien, algunos 
sistemas, como MS-Windows, extiende este comportamiento para aceptar el 
canal de entrada estándar. Sin embargo, esto no es un comportamiento 
estándar, por lo que no funcionará en todos los sistemas.

La recomendación es usar 'ignore()' o incluso comprobar antes si hay 
caracteres en el búfer con: cin.rdbuf()->in_avail()  El problema es que 
'in_avail()' no siempre funciona correctamente bajo ciertos sistemas.


Espero haber aclarado un poco más este tema.

Steven





Más información sobre la lista de distribución Cconclase