Saltar al contenido

getline() no funciona si se usa después de algunas entradas

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, badbito 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *