salida - Usando getline() en C++
limpiar buffer en c++ (6)
Tengo un problema al usar el método getline para obtener un mensaje que los tipos de usuario, estoy usando algo como:
string messageVar;
cout << "Type your message: ";
getline(cin, messageVar);
Sin embargo, no se detiene para obtener el valor de salida, ¿qué hay de malo en esto?
Creo que no estás pausando el programa antes de que termine, por lo que la salida que estás poniendo después de obtener el inpus no está viendo en la pantalla ¿no?
hacer:
getchar();
antes del final del programa
El código es correcto El problema debe estar en otro lugar. Pruebe el ejemplo minimalista de la documentación std :: getline.
main ()
{
std::string name;
std::cout << "Please, enter your full name: ";
std::getline (std::cin,name);
std::cout << "Hello, " << name << "!/n";
return 0;
}
Si está utilizando getline()
después de cin >> something
, necesita vaciar el carácter de nueva línea del buffer intermedio. Puedes hacerlo usando cin.ignore()
.
Sería algo como esto:
string messageVar;
cout << "Type your message: ";
cin.ignore();
getline(cin, messageVar);
Esto sucede porque el operador >>
deja un carácter de nueva línea /n
en el búfer de entrada. Esto puede convertirse en un problema cuando realiza una entrada sin formato, como getline()
, que lee la entrada hasta que se encuentre un carácter de nueva línea. Esto sucede, dejará de leer inmediatamente, debido a eso /n
que quedó allí colgado en su operación anterior.
Si solo tiene una sola línea nueva en la entrada, simplemente haciendo
std::cin.ignore();
funcionará bien Lee y descarta el siguiente carácter de la entrada.
Pero si todavía tiene algo más en la entrada, además de la línea nueva (por ejemplo, si leyó una palabra pero el usuario ingresó dos palabras), entonces tiene que hacer
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), ''/n'');
Ver, por ejemplo, esta referencia de la función de ignore
.
Para estar aún más seguro, haga la segunda alternativa anterior en un ciclo hasta que gcount
regrese a cero.
Tuve problemas similares El único inconveniente es que con cin.ignore (), tiene que presionar enter 1 vez más, lo que complica el programa.
int main(){
.... example with file
//input is a file
if(input.is_open()){
cin.ignore(1,''/n''); //it ignores everything after new line
cin.getline(buffer,255); // save it in buffer
input<<buffer; //save it in input(it''s a file)
input.close();
}
}