Estoy tratando de leer en y, a continuación, salida el contenido de un archivo de texto con tres líneas, de la siguiente manera:

Bob Dylan 10 9

John Lennon 8 7

David Bowie 6 5

Para cada línea, solo quiero salida de la línea, es decir, firstName LastName número1 número2.

Estoy usando el siguiente código:

int num1;
int num2;
string firstName;
string lastName;
string fullName; 
ifstream inFile;

inFile.open("inputFile.txt");

while (getline(inFile, firstName))
    {
        inFile >> firstName >> lastName >> num1 >> num2;

        fullName = firstName + " " + lastName;

        cout << fullName << " " << num1 << " " << num2 << endl;
    }

inFile.close();

Hay 2 problemas con la salida de este. En primer lugar, la primera línea no es de salida, aunque a partir de la experimentación sé que lo HACE leer en. Segundo, después de las 2 últimas líneas son de lectura y de salida (como se desee), el programa muestra todo en la última línea, EXCEPTO el primer nombre (en este caso, la última cosa que se imprime es Bowie 6 5).

Alguien puede utilizar este sencillo ejemplo para explicar cómo la función getline funciona cuando la lectura en múltiples líneas de un archivo? (Ni siquiera sé si es la mejor manera, pero es la única manera que conozco hasta ahora). Aquí están algunas preguntas específicas.

Primero, ¿el tiempo de bucle condicional getline(inFile, nombre) que devolver un valor booleano? Si es así, ¿cómo puede ser verdadera (es decir, cómo puede el while loop start) si no he dado el nombre de un valor aún? Es el caso de que el programa lee la primera línea y si hay algo ahí, a continuación, ejecuta el bucle while, pero a partir de la segunda línea, porque ya utiliza el primero para comprobar el contenido?

Segundo lugar, si el nombre tiene un valor, y si ese valor es el primer nombre en la primera línea («Bob» en este caso), ¿por qué no la primera línea de salida en todos los? He sido el tormento de mi cerebro tratando de averiguar donde fue.

Tercero, después de que el programa lee y muestra las dos últimas líneas, el programa pasa a la línea siguiente y se encuentra con nada pero los espacios en blanco, a la derecha? Entonces ¿cuál sería el valor de nombre? Sería en blanco, o si todavía ser «David»? Si está en blanco, ¿por qué el bucle while ejecutar de nuevo? Pero si es «David», entonces ¿por qué el programa no salida de ese valor, junto con los otros?

Por cierto, estoy trabajando fuera de un libro de texto (no para la tarea), y cubre getline, pero no para varias líneas. Pero, a continuación, los ejercicios que involucran múltiples líneas, así que estoy un poco perdido.

  • Usted está lanzando su getline() resultados con la primera extracción a firstName inmediatamente después. Usted puede empezar por ahí. Sobre una muestra de getline(), hay uno en la línea-docs.
InformationsquelleAutor user3128869 | 2013-12-24

1 Comentario

  1. 7

    Usted está tratando de leer cada línea dos veces.

    while (getline(inFile, firstName)) //reads the line
        {
            //reads the next line and overwrites firstName!
            inFile >> firstName >> lastName >> num1 >> num2;

    Cambio de:

    while ( inFile >> firstName >> lastName >> num1 >> num2 )
    {
        fullName = firstName + " " + lastName;
        cout << fullName << " " << num1 << " " << num2 << endl;
    }

    EDITAR: Para responder a tus preguntas:

    ¿Cómo getline() trabajo?

    Lee toda la línea ‘\n’ carácter o el carácter delimitador especificado. http://www.cplusplus.com/reference/string/string/getline/?kw=getline

    Después de la lectura de la línea, el control pasa a la siguiente línea en el archivo.

    También, se devuelve un valor booleano true si la operación de lectura fue un éxito, de lo contrario false.

    El operador de extracción trunca en todos los espacios en blanco de forma predeterminada. También devuelve un valor booleano que indica si la operación fue exitosa.

    • El abandono de getline totalmente, como se sugiere aquí, en realidad tiene mucho sentido, ya que la única razón por la que yo lo estaba usando para empezar era leer en el espacio entre nombre y apellidos, pero que al final me la concatenación de las dos de todos modos! Pero yo no sabía que la extracción podría ser utilizado como condición para que el bucle while. Gracias por la información útil y sugerencias!

Dejar respuesta

Please enter your comment!
Please enter your name here