2013-06-19 15 views
6

ja tylko przeglądu dla moich egzaminów i nie mogą dostać głowę wokół następujących świadczone przez naszego wykładowcę:Dlaczego najpierw czytać plik, a następnie sprawdzić?

Podczas otwierania fstreams, sprawdź czy masz otwarte lub nie

  • Następnie przeczytać przed sprawdzić input_file.fail()

  • sprawdzając wcześniej czytać, może skończyć się z dodatkowym niechcianego wejścia

Nie ma sensu czytać najpierw, czy nie powinienem najpierw sprawdzić?

Jeśli ktoś jest w stanie wyjaśnić, byłbym bardzo wdzięczny :)

Odpowiedz

10

input_file.fail() określa, czy wszelkie operacje poprzedzające nie udało, a nie czy nadchodzący operacja jedzie na niepowodzenie. W konsekwencji, jeśli piszesz tak:

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

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

Następnie po przeczytaniu value, nie masz pojęcia, czy w ogóle właściwie odczytać cokolwiek z powodzeniem lub nie. Wszystko, co wiesz, to to, że przed zrobiłeś odczyt, wszystko działało poprawnie. Jest całkiem możliwe, że nie udało się odczytać liczby całkowitej, ponieważ trafiłeś na koniec pliku lub dane w pliku nie były liczbą całkowitą.

Z drugiej strony, jeśli piszesz

int value; 
input_file >> value; 

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

Wtedy spróbujesz zrobić odczytu. Jeśli się powiedzie, przetworzysz wartość, którą przeczytałeś. Jeśli nie, możesz wtedy zareagować na fakt, że ostatnia operacja się nie udała.

(Można być jeszcze ładniejsza niż ta.

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

która łączy operacje odczytu i badań w jeden To znacznie jaśniejsze tutaj, że jesteś potwierdzający, że odczyt udało.)

Jeśli robisz czyta w pętli, bardzo czysty sposób, aby to zrobić jest

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

to sprawia, że ​​jasne, że pętla, gdy jesteś w stanie utrzymać wartości odczytu z pliku.

Mam nadzieję, że to pomoże!

+0

Tak! To wszystko ma sens. A jeśli to się nie powiedzie, wyczyść plik, komunikat o błędzie itp.? Dziękujemy! – jewfro

+0

@ jewfro- Tak, to brzmi dobrze! – templatetypedef

+0

Skróty dla pętli if i loop działają, ponieważ operator '>>' zwraca odniesienie do strumienia, a operator 'bool' w strumieniu wywołuje' fail'. –

Powiązane problemy