[C++] Mini aporte, solución para la mayoría de problemas con la entrada de datos

Iniciado por class_OpenGL, 5 Agosto 2016, 02:29 AM

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

class_OpenGL

Hola, muy buenas. Hoy quería poner una solución que quizás no se haya tenido en cuenta. Por ejemplo, es una solución para los problemas como: ¿por qué a veces cuando leo datos de la consola se salta alguna toma de datos? Bueno, la respuesta a eso es que probablemente al introducir datos en algún paso anterior, se han introducido datos de más y esos datos están esperando a salir, por lo que en la siguiente toma de datos, se toman datos del paso anterior.

Bueno, entonces, la solución que he descubierto (yo no la conocía) es usar el método std::istream::sync. Lo que hace este método es sincronizar el búfer interno en el que se almacenan esos datos de pasos anteriores con la toma de datos actual. Entonces, lo que habría que hacer es colocar ese método antes de cualquier toma de datos:

Código (cpp) [Seleccionar]
#include <iostream>

int main() {
// Aquí llenaremos el búfer de datos innecesarios para demostrar el uso de std::cin.sync
std::cout << "Introduzca datos: ";
std::cin.get();

// ... Código

std::cout << "Introduzca datos de nuevo: ";
std::cin.sync();
// Pedimos un carácter y lo imprimimos:
std::cout << (char)std::cin.get();

return 0;
}


Este código tendría la siguiente salida (en este ejemplo):
Introduzca datos: aaaaaaaaaaaaaaaaa
Introduzca datos de nuevo: r
r


Como ven, a pesar de haber llenado el búfer con el carácter 'a', se ha impreso el último carácter leído. Eso demuestra que funciona. Lo que no me queda del todo claro es cómo funciona este método, así que quizás sea ineficiente o algo por el estilo.

Sabiendo esto, ¿alguien sabe si usar todo el rato std::istream::sync tiene algún inconveniente? Gracias!

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

ivancea96

Preferible usar getline, o ignore.
El funcionamiento de sync depende del tipo de buffer, y de la implementación.
http://ideone.com/UMDA8w

class_OpenGL

Entonces, ¿qué es lo que hace exactamente este método? No lo entiendo muy bien

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

ivancea96

No tengo más que decir que lo que pone en esta wiki: http://en.cppreference.com/w/cpp/io/basic_streambuf/pubsync
istream::sync termina llamando a streambuf::sync.
En general, explica que, en buffers de salida, escribe lo que tenga almacenado (como haría flush). En buffers de entrada, limpia lo almacenado y vuelve a leer.
Por defecto, no hará nada.

De istream: http://en.cppreference.com/w/cpp/io/basic_istream/sync
Citarsync() puede vaciar el buffer, rellenarlo, o no hacer nada. En Visual Studio, descartará la entrada que no haya sido tratada cuando se utilice con un flujo de entrada estándar.

En fin. Un método virtual genérico que, supongo, proveen para que manejes tus buffers.