2013-06-19 5 views
6

ich revidieren nur meine Prüfungen für und kann meinen Kopf nicht bekommen um die von unseren Vortragenden zur Verfügung gestellt folgende:Warum zuerst die Datei lesen und dann prüfen?

Wenn fstreams öffnen, prüfen Sie, ob Sie oder nicht

  • Dann lesen, bevor geöffnet haben Check für input_file.fail()

  • Wenn Sie vor dem lesen überprüfen, Sie mit einer zusätzlichen unerwünschten Eingabe können am Ende

Es macht keinen Sinn, zuerst zu lesen, sollten Sie nicht zuerst überprüfen?

Wenn jemand zu erklären, ist in der Lage, wäre ich sehr dankbar :)

Antwort

10

input_file.fail() bestimmt, ob alle vorhergehenden Operationen fehlgeschlagen sind, nicht, ob die kommende Operation fehlschlagen wird. Wenn Sie also schreiben:

if (!input_file.fail()) { 
    int value; 
    input_file >> value; 

    /* ... process value ... */ 
} 

Dann nach der Lektüre value, Sie haben keine Ahnung, was auch immer, ob Sie tatsächlich etwas erfolgreich gelesen oder nicht. Alles, was Sie wissen, ist, dass direkt vor Sie gelesen haben, alles funktionierte korrekt. Es ist durchaus möglich, dass Sie eine Ganzzahl nicht lesen konnten, weil Sie entweder das Ende der Datei angetippt haben oder die Daten in der Datei keine Ganzzahl waren.

Auf der anderen Seite, wenn Sie

int value; 
input_file >> value; 

if (!input_file.fail()) { 
    /* ... process value ... */ 
} 

Dann schreiben Sie versuchen, eine Lese zu tun. Wenn es erfolgreich ist, verarbeiten Sie den Wert, den Sie gelesen haben. Wenn nicht, können Sie darauf reagieren, dass die letzte Operation fehlgeschlagen ist.

(Sie können sogar cuter als diese sein.

int value; 
if (input_file >> value) { 
    /* ... process value ... */ 
} 

, die die Lese- und Testoperationen in einem vereint Hier ist es viel klarer, dass Sie, dass die Lese gelungen sind bestätigt.)

Wenn Sie tun in einer Schleife liest, eine sehr saubere Art und Weise, dies zu tun

for (int value; input_file >> value;) { 
    /* ... process value ... */ 
} 

Dies macht deutlich, dass Sie Schleife, während Sie in der Lage sind, aus der Datei lesen Werte zu halten.

Hoffe, das hilft!

+0

Ja! Das macht alles Sinn. Und dann, wenn es fehlschlägt, löschen Sie die Datei, Fehlermeldung etc etc? Vielen Dank! – jewfro

+0

@ jewfro- Ja, das klingt richtig! – templatetypedef

+0

Die Verknüpfungen für die if-Schleife funktionieren, weil der Operator '>>' einen Verweis auf den Stream zurückgibt und der 'bool'-Operator im Stream 'fail' aufruft. –