Te doy la bienvenida a proyecto online, en este lugar encontrarás la respuesta a lo que buscas.
Solución:
Los caracteres se extraen hasta que se extraen (n – 1) caracteres o se encuentra el carácter delimitador (que es delimitador si se especifica este parámetro, o ‘n’ en caso contrario). La extracción también se 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.
Cuándo cin.getline()
lee de la entrada, queda un carácter de nueva línea en el flujo de entrada, por lo que no lee su c-string. Usar cin.ignore()
antes de llamar getline()
.
cout<<"Journal Entry:t";
cin.ignore();
cin.getline(journal,23);
Agregando a lo que dijo @DavidHammen:
Las operaciones de extracción dejan el rastro 'n'
personaje en la corriente. Por otro lado, istream::getline()
lo descarta. Así que cuando llames getline
después de un operador de extracción, 'n'
es el primer personaje que encuentra y deja de leer allí mismo.
Pon esto después de antes getline
extracción de llamadas:
cin.ignore()
Una forma más robusta de recibir información 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::max(), 'n');
cin.clear(); // clear the error flags
cout << "Invalid input, try again.n";
No estás comprobando el estado de la transmisión. El std::cin
operador de extracción de flujo (operator>>
) puede fallar. Cuando lo hace, la transmisión se marca como "mala" (failbit
, badbit
o eofbit
se establecen). Una vez "malo", todas las extracciones de flujo posteriores en ese flujo fallarán a menos que borre el estado.
Aprende 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 debe hacer es simplemente asumir que funcionó.
Recuerda que puedes comunicar este post si lograste el éxito.