2012-10-02 16 views
12

Duplicar posibles:
Need help with getline()getline() no funciona si se utiliza después de algunos insumos

getline() no está funcionando, si lo uso después de algunas entradas, es decir

#include<iostream> 
using namespace std; 

main() 
{ 
string date,time; 
char journal[23]; 


cout<<"Date:\t"; 
cin>>date; 
cout<<"Time:\t"; 
cin>>time; 

cout<<"Journal Entry:\t"; 
cin.getline(journal,23); 


cout<<endl; 
system("pause"); 
} 

donde como si uso getline() en la parte superior de las entradas, funciona, por ej.

cout<<"Journal Entry:\t"; 
cin.getline(journal,23); 
cout<<"Date:\t"; 
cin>>date; 
cout<<"Time:\t"; 
cin>>time; 

¿Cuál es el motivo?

+1

Por favor, defina "no está funcionando". ¿Qué resultados esperabas y qué obtienes? –

Respuesta

25

Los caracteres se extraen hasta que (n - 1) personajes han sido extraídos o se encuentra el carácter de delimitación (que es delim si no se especifica este parámetro , o '\ n' de otra manera). La extracción también detiene si se llega al final del archivo en la secuencia de entrada o si se produce un error durante la operación de entrada.

Cuando cin.getline() lee de la entrada, hay un carácter de nueva línea en el flujo de entrada, por lo que no lee su cadena. Use cin.ignore() beore llamando al getline().

cout<<"Journal Entry:\t"; 
cin.ignore(); 
cin.getline(journal,23); 
+0

¿Qué pasa con 'int' todavía' \ n' provocó el problema para 'getline()'? – UnKnown

+0

Esto es algo tan importante y no se menciona en muchos de los sitios web que explican la funcionalidad de getline. – ViruMax

2

No está verificando el estado del flujo. El operador de extracción de flujo std::cin (operator>>) puede fallar. Cuando lo hace, la transmisión se marca como "incorrecta" (failbit, badbit, o eofbit están configurados). Una vez que sea "incorrecto", todas las extracciones de flujo subsiguientes en esa secuencia fallarán a menos que borre el estado.

Aprenda a ser un programador paranoico. Siempre verifique el estado de esas operaciones de entrada formateadas. Podría, por ejemplo, lanzar una excepción, o imprimir un mensaje de error y salir. Lo único que no debes hacer es simplemente asumir que funcionó.

6

Agregando a lo que dijo @DavidHammen:

Las operaciones de extracción de salir de la '\n' carácter final en la corriente. Por otro lado, istream::getline() lo descarta. Entonces, cuando llama al getline después de un operador de extracción, '\n' es el primer caracter que encuentra y deja de leer allí mismo.

Ponga esta extracción después getline antes llamada:

cin.ignore()

Una forma más robusta de tomar la entrada sería algo como esto:

while (true) { 

    cout<<"Time:\t"; 
    if (cin>>time) { 
     cin.ignore(); // discard the trailing '\n' 
     break; 
    } else { 
     // ignore everything or to the first '\n', whichever comes first 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
     cin.clear(); // clear the error flags 
     cout << "Invalid input, try again.\n"; 
    } 
} 
Cuestiones relacionadas