C/Visual C - Limpiar Buffer de entrada

 
Vista:

Limpiar Buffer de entrada

Publicado por Nasón (40 intervenciones) el 28/07/2004 18:37:01
Hola a todos, os voy a plantear una duda en C++:
Se trata de la limpieza del b?fer de la entrada est·ndar.
Como sabeis, en C bastaba simplemente con la funciÛn fflush();. En C++
escribimos cin.ignore(numeric_limits<int>::max(), '\n'); y el sistema
descartar· todos los caracteres que haya en la entrada hasta '\n'
incluido Èste.
Quiero hacer una funciÛn para hacer una pausa hasta que el usuario
<entrar> y para ello escribo:
cout << "\nPulse ENTRAR para continuar . . . "; //indicamos la pausa
cin.ignore(numeric_limits<int>::max(), '\n'); //limpiamos el b?fer
cin.get(car); //leemos ENTER y continuamos
Como '\n' es una entrada v·lida para cin.get(), limpiamos el b?fer
antes de su llamada. El problema viene cuando se aplica cin.ignore()
al b?fer y Èste est· vacÌo (imaginemos un programa largo en el que no
sabemos cÛmo est· o cualquier otra causa). Seg?n mi experiencia, he
llegado a la conclusiÛn de que por cada vez que se aplique la limpieza
al b?fer vacÌo, para que luego funcione cin.get() hay que pulsar enter
una vez de m·s por cada uso de la funciÛn de limpieza. Es decir,
imaginemos que el b?fer est· vacÌo y aplicamos nuestra funciÛn pausa();.
Antes de la llamada a cin.get() se ha ejecutado cin.ignore(), el
resultado es que, en vez de pulsar sÛlo una vez <entrar> para continuar
, tengo que hacerlo dos veces.
Una posible soluciÛn es comprobar si en el b?fer hay datos; para ello
hago:
if (cin.rdbuf()->in_avail())
cin.ignore(numeric_limits<int>::max(), '\n');
cin.rdbuf()->in_avail() devuelve el n?mero de datos que hay en el b?fer,
si es distinto de cero se ejecuta la limpieza. El problema es que
cin.rdbuf()->in_avail() devuelve siempre un cero en LINUX, haya o no
haya datos en el b?fer.
Total, que esta soluciÛn solo es operativa en windows, con lo cual
se reduce la portabilidad del programa.
ø¡lguien sabe salir del atolladero (soluciÛn para todas las plataformas)?
La funciÛn para limpiar en b?fer tambiÈn ser· utilizada en otros
ambientes, con lo cual es ella el meollo de la cuestiÛn.

Ayuda, please.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder