getline () restituisce riga vuota in Eclipse ma funziona correttamente in Dev C ++
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.
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;
}