variable instruccion dev borland archivos c++ getline

c++ - instruccion - getline(cin variable)



c++ getline() no está esperando la entrada de la consola cuando se llama varias veces (6)

Estoy intentando obtener algunos parámetros de entrada del usuario desde la consola, dos cadenas, dos pulgadas y una doble. El código relevante que estoy tratando de usar es este:

#include <string> #include <iostream> using namespace std; // ... string inputString; unsigned int inputUInt; double inputDouble; // ... cout << "Title: "; getline(cin, inputString); tempDVD.setTitle(inputString); cout << "Category: "; getline(cin, inputString); tempDVD.setCategory(inputString); cout << "Duration (minutes): "; cin >> inputUInt; tempDVD.setDuration(inputUInt); cout << "Year: "; cin >> inputUInt; tempDVD.setYear(inputUInt); cout << "Price: $"; cin >> inputDouble; tempDVD.setPrice(inputDouble);

Sin embargo, cuando se ejecuta el programa, en lugar de esperar a que se ingrese el primer inputString, el código no se detiene hasta la segunda llamada a getline (). Así, la salida de la consola se ve así:

Título: Categoría:

con el cursor apareciendo después de la categoría. Si ingreso ahora, el programa salta al ingreso del año, no permitiéndome ingresar más de una cadena. ¿Que esta pasando aqui?


El problema es que está mezclando llamadas a getline () con el uso del operador >>.

Recuerde que el operador >> ignoró el espacio en blanco inicial, por lo que continuará correctamente a través de los límites de las líneas. Pero deja de leer después de que la entrada se haya recuperado con éxito y, por lo tanto, no tragará los caracteres ''/ n''. Por lo tanto, si usa un getline () después de un >>, por lo general obtiene lo incorrecto a menos que tenga cuidado (para eliminar primero el carácter ''/ n'' que no se leyó).

El truco es no usar ambos tipos de entrada. Escoge el apropiado y apégate a él.

Si son todos los números (u objetos que juegan bien con el operador >>), simplemente use el operador >> (la cadena de nota es el único tipo fundamental que no es simétrico con la entrada / salida (es decir, no se reproduce bien)).

Si la entrada contiene cadenas o una combinación de cosas que requerirán getline (), solo use getline () y analice el número de la cadena.

std::getline(std::cin, line); std::stringstream linestream(line); int value; linestream >> value; // Or if you have boost: std::getline(std::cin, line); int value = boost::lexical_cast<int>(line);


Es necesario vaciar el búfer de entrada. Se puede hacer con cin.clear(); cin.sync(); cin.clear(); cin.sync(); .


Mezclar getline () con flujos de entrada en general es algo malo de hacer. Teóricamente, es posible manejar manualmente los buffers sucios que se producen mediante el uso de flujos, pero es un dolor innecesario que definitivamente debe evitarse.

Es mejor utilizar una biblioteca de consola para captar su entrada, de esta manera el trabajo sucio se puede abstraer para usted.

Echa un vistazo a TinyCon. Solo puede usar el método estático tinyConsole :: getLine () en reemplazo de sus llamadas getline y streaming, y puede usarlo tantas veces como lo desee.

Puede encontrar información aquí: https://sourceforge.net/projects/tinycon/


Puedes usar

cin.ignore();

o como @kernald mencionó uso

cin.clear(); cin.sync();

antes de usar getline ()


Use cin.clear() como se mencionó y use el manejo adecuado de errores:

cin.clear(); cin.sync(); cout << "Title: "; if (!getline(cin, inputString)) exit 255; tempDVD.setTitle(inputString); cout << "Category: "; if (!getline(cin, inputString)) exit 255; tempDVD.setCategory(inputString); cout << "Duration (minutes): "; if (!(cin >> inputUInt)) exit 255; tempDVD.setDuration(inputUInt); cout << "Year: "; if (!(cin >> inputUInt)) exit 255; tempDVD.setYear(inputUInt); cout << "Price: $"; if (!(cin >> inputDouble)) exit 255; tempDVD.setPrice(inputDouble);


cin.sync (); Usa esto en lugar de cin.ignore (funciona mejor.