2012-04-08 12 views
0

Mögliche Duplizieren:
Reading from text file until EOF repeats last line
c++ EOF running one too many times?Warum C++ ifstream die Datei mit doppelten Datensätzen lesen

ich eine einfache c schreibe ++ Code eine binäre Datei lesen und schreiben, aber ich festgestellt, dass der ifstream den Datensatz zweimal lesen wird. Ich weiß nicht, wie dies geschieht, aber ich versuche, den Code mit mingw32 in Windows und Linux, den gleichen Fall

ofstream outfile; 
int data[5]; 
outfile.open("abc.out", ios::out | ios::trunc | ios::binary); 
data[0] = data[1] = 1; 
data[2] = data[3] = 2; 
data[4] = -1; 
cout << "ORIGINAL DATA:" << data[0] << " " << data[1] << " " << data[2] << " " << data[3] << " " << data[4] << endl << endl; 
outfile.write((char *)&data[0], 5*sizeof(int)); 
outfile.close();  


ifstream infile; 
infile.open("abc.out", ios::in | ios::binary); 
data[0] = data[1] = data[2] = data[3] = data[4] = 0; 
while (!infile.eof()) 
{ 
    infile.read((char *)&data[0], 5*sizeof(int)); 
    cout << data[0] << " " << data[1] << " " << data[2] << " " << data[3] << " " << data[4] << endl; 
} 

hier zu kompilieren ist die Ausgabe

ORIGINALDATEN: 1 1 2 2 -1

1 1 2 2 -1

1 1 2 2 -1

+0

'infile.eof()' gibt nur true * nach * nicht lesen, so dass die Schleife einmal zu viel ausgeführt wird. –

+0

Danke Bo Persson, aber ich verstehe immer noch nicht, wie ich das beheben kann. Lesen "Lesen von Textdatei, bis EOF die letzte Zeile wiederholt", versuche ich den folgenden Code while (wahr) { ... wenn (infile.eof()) zu brechen; } funktioniert aber immer noch nicht – user1285419

+1

@user - Sie können für eof testen, oder überprüfen Sie den Rückgabewert von 'lesen' (Hinweis, Hinweis!), Bevor Sie sich entscheiden, zu cout schreiben. –

Antwort

2

nicht immer .eof() oder .good() als Schleifenbedingung verwenden. Es erzeugt fast immer fehlerhaften Code (wie in diesem Fall).

Die idiomatische Muster zum Lesen von Daten ist C++ ist das:

while (infile.read((char *)&data[0], 5*sizeof(int))) 
{ 
    cout << data[0] << " " << data[1] << " " << data[2] << " " 
     << data[3] << " " << data[4] << endl; 
} 
2

@BoPersson Wie bereits erwähnt, ist das Problem ergibt sich aus while (!infile.eof()) verwenden, welche praktisch immer ein Fehler vorliegt. Stattdessen möchten Sie das Ergebnis des Lesens der Daten überprüfen. Eine erste Annäherung würde wie folgt aussehen:

// prefer 1-step initialization -- supply parameters to ctor. 
ifstream infile("abc.out", ios::in | ios::binary); 

while (infile.read((char *)&data[0], 5*sizeof(int)) 
    cout << data[0] << " " 
     << data[1] << " " 
     << data[2] << " " 
     << data[3] << " " 
     << data[4] << endl; 
+0

Vielen Dank Jerry Coffin. Es klappt :) – user1285419

1

Da ein Strom schlecht geht, wenn ein Lese ausfällt und ein schlecht Strom kann als falsch Bool zu sehen ist, und da Lese liefert den Strom istelf, Sie können tun

while(infile.read((char *)&data[0], 5*sizeof(int))) 
    cout << data[0] << " " << data[1] << " " << data[2] << " " << data[3] << " " << data[4] << endl; 

damit die Schleife nur auf den Lesefehler verlassen.

Verwandte Themen