getline () devuelve línea vacía en Eclipse, pero funciona correctamente en Dev C ++

StackOverflow https://stackoverflow.com/questions/2543057

  •  23-09-2019
  •  | 
  •  

Pregunta

Aquí está mi código:

#include <iostream>
#include <stdlib.h>
#include <fstream>

using namespace std;

int main() {
    string line;
    ifstream inputFile;
    inputFile.open("input.txt");

    do {
        getline(inputFile, line);
        cout << line << endl;
    } while (line != "0");

    return 0;
}

entrada.txt contenido:

5 9 2 9 3
8 2 8 2 1
0

En Enclipse, va al infinito-loop. Estoy usando MinGW 5.1.6 + Eclipse CDT.

He intentado muchas cosas pero no pude encontrar el problema.

¿Fue útil?

Solución

Ya que estás en las ventanas Proveedores:

} while (line != "0\r");

La última línea se almacena como "0\r\n". El \n se utiliza como el delimitador de línea por getline por lo que la lectura real de la línea será "0\r"

o

puede convertir el formato de archivo de dos a formato UNIX con el comando

dos2unix input.txt

Ahora su programa original debería funcionar. El comando cambiará el \r\n al final de la línea para \n

También se debe hacer siempre la comprobación de errores después de intentar abrir un archivo, algo como:

inputFile.open("input.txt");
if(! inputFile.is_open()) {
 cerr<< "Error opening file";
 exit(1);
}

Otros consejos

Se va a crear un bucle infinito si no hay línea contiene exactamente 0. Por ejemplo 0\n no es lo mismo que 0. Mi conjetura es que ese es su problema.

EDIT: Para elaborar, getline se debe de desechar el salto de línea. Tal vez la nueva línea de codificación de archivos a su mal (es decir, las ventanas frente a UNIX).

Su principal problema es el directorio de trabajo.
Debido a que está especificando un archivo con una ruta relativa que busca el archivo desde el directorio de trabajo actual. El directorio de trabajo puede ser especificado por el entorno de desarrollo. . (Nota: El directorio de trabajo no es necesariamente el mismo directorio en el que las vidas ejecutables (esto es una suposición común entre los principiantes, pero sólo se mantiene en circunstancias muy especiales))

A pesar de que tiene un final especial de marcador de entrada "0" se debe también comprobar que el getline () no está fallando (como podría error a cabo por otras razones (incluyendo entrada de pequeños y brillantes con formato). Como tal, es generalmente el mejor comprobar el estado del archivo como lo lee.

int main()
{
    string   line;
    ifstream inputFile;
    inputFile.open("input.txt");

    while((getline(inputfile, line)) && (line != "0"))
    {
        // loop only entered if getline() worked and line !="0"
        // In the original an infinite loop is entered when bad input results in EOF being hit.

        cout << line << endl;
    }
    if (inputfile)
    {
        cout << line << endl; // If you really really really want to print the "0"
                             // Personally I think doing anything with the termination
                             // sequence is a mistake but added here to satisfy comments.
    }

    return 0;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top