getline () restituisce riga vuota in Eclipse ma funziona correttamente in Dev C ++

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

  •  23-09-2019
  •  | 
  •  

Domanda

Qui è il mio codice:

#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;
}

input.txt contenuti:

5 9 2 9 3
8 2 8 2 1
0

In Enclipse, va a infinito loop. Sto usando MinGW 5.1.6 + Eclipse CDT.

Ho provato molte cose, ma non riuscivo a trovare il problema.

È stato utile?

Soluzione

Dal momento che siete su Windows provare:

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

L'ultima riga viene memorizzata come "0\r\n". Il \n viene utilizzato come delimitatore di linea da getline così la linea di lettura reale sarà "0\r"

o

è possibile convertire il file in formato DOS al formato UNIX utilizzando il comando

dos2unix input.txt

Ora il vostro programma originale dovrebbe funzionare. Il comando cambierà il \r\n alla fine della linea per \n

Inoltre si dovrebbe sempre fare il controllo degli errori dopo che si tenta di aprire un file, qualcosa come:

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

Altri suggerimenti

Si creerà un ciclo infinito se non riga contiene esattamente 0. Per esempio 0\n non è la stessa cosa di 0. La mia ipotesi è che questo è il problema.

EDIT: Elaborare, getline dovrebbe essere scartando il ritorno a capo. Forse la codifica nuova riga del file di sbagliato (cioè finestre contro Unix).

Il problema principale è la directory di lavoro.
Perché si specifica un file utilizzando un percorso relativo che cerca il file dalla directory di lavoro corrente. La directory di lavoro può essere specificato dal vostro ambiente dev. (Nota: la directory di lavoro non è necessariamente la stessa directory in cui le vite eseguibili (questo è un presupposto comune tra i principianti, ma tiene solo in circostanze molto particolari))

.

Anche se si dispone di un fine speciale di marcatore di ingresso "0" si dovrebbe anche verificare che il getline () non sta venendo a mancare (come potrebbe errore fuori per altri motivi (tra cui Beady ingresso formattato). Come tale solito è meglio controllare lo stato del file come si legge.

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top