2017-01-29 2 views
4

Ich schreibe ein Programm, das mehrere Variablen aus einer Textdatei nimmt. Wenn das Programm EOF findet,
beendet es die Dateneingabe.Unterschied zwischen ifstream.good() und bool (ifstream)

int main() 
{ 
    int val, count = 0; 
    ifstream fileIn; 
    fileIn.open("num.txt"); 

    fileIn >> val; 
    while (fileIn) 
    { 
     ++count; 
     cout << "number: " << val << endl; 
     fileIn >> val; 
    } 
    cout << "count: " << count << endl; 

    fileIn.close(); 
    return 0; 
} 

num.txt Datei: 11 22 33 44

Programmausgabe:

number: 11 
number: 22 
number: 33 
number: 44 
count: 4 

Alles ist in Ordnung. Aber wenn ich den während Bedingung Abschnitt von fileIn zu fileIn.good() ändern,
die Programmausgabe wird wie folgt aussehen:

number: 11 
number: 22 
number: 33 
count: 3 

Es ist nun letzten Wert springt. Warum passiert das und was ist der Unterschied zwischen fileIn
und fileIn.good()?

+0

http://en.cppreference.com/w/cpp/io/basic_ios/good – chris

Antwort

4

Es überspringt den letzten Wert jetzt. Warum passiert das und was ist der Unterschied zwischen fileIn und fileIn.good()?

fileIn >> val; 
while (fileIn) 
{ 
    ++count; 
    cout << "number: " << val << endl; 
    fileIn >> val; 
} 

Für einen gegebenen Gehalt an "11 22 33 44" im Strom mit fileIn verbunden. Mit bool(fileIn)conversion operator wird zurückgegeben, ob der Stream nicht ausgefallen ist. Beachten Sie, dass das Erreichen von eof() kein Fehler des Streams ist. Der Fehler tritt grundsätzlich auf, wenn eine E/A-Operation fehlschlägt.

Also, nach dem Lesen der letzten Nummer 44 in val. Die Schleife wird erneut aufgerufen, da der Datenstrom nicht ausgefallen ist: count wird inkrementiert, val wird gedruckt, aber die nächste fileIn >> val wird fehlschlagen. Dies wird dann im Zustand der while-Schleife getestet und der Fehler führt dazu, dass die Schleife beendet wird.

Doing fileIn.good() gibt false zurück, wenn einer der state flags des Streams gesetzt wurde. Insbesondere eof, fail und bad

2

if (fileIn) entspricht if (!fileIn.fail()), die true zurück, wenn badbit oder failbit in rdstate() eingestellt ist.

Auf der anderen Kontrollen Hand fileIn.good() wenn rdstate() auf 0 zusätzlich zu fail() So entspricht es überprüft auch eofbit Flagge.

Es überspringt den letzten Wert jetzt. Warum passiert das und was ist der Unterschied zwischen fileIn und fileIn.good()?

Weil Sie lesen val dann Zustand des Stromes while(fileIn.good()) mit überprüfen und dann ausgegeben letzten Wert, der nie da dann gesehen wird fileIneofbit gesetzt hat. Was nicht wie oben beschrieben von if(infs) überprüft wird.

Verwandte Themen