2013-01-15 17 views
8

Powiel możliwe (foobar.eof()!):
Why is iostream::eof inside a loop condition considered wrong?
eof() bad practice?Dlaczego (foobar >> x) preferowane nad

Mój nauczyciel powiedział, że nie należy używać EOF do czytania w pliku tekstowym lub plikach binarnych zamiast tego powinniśmy użyć (afile >> x). Nie wyjaśnił dlaczego, czy ktoś może mi wyjaśnić. Czy ktoś może wyjaśnić również, jakie są różnice w tych dwóch różnych metod odczytu

//Assuming declaration 
//ifstream foobar 



(! foobar.eof()) 
{ 
    foobar>>x; // This is discouraged by my teacher 

} 


while (foobar>>x) 
{ 
    //This is encouraged by my teacher 

} 
+0

[this] (http://stackoverflow.com/questions/6512173/ifstream-not-reading-eof-character) i wiele innych. – Rapptz

Odpowiedz

13

Ponieważ plik nie znajduje się na końcu zanim spróbujesz odczytać z niego.

operator>> zwraca referencję do strumienia w stanie, w jakim jest po odczytu zostało przeprowadzone i czy udało, czy nie, a strumień ocenia się true gdyby udało lub false gdyby nie powiodło się. Testowanie pod kątem eof() oznacza, że ​​plik nie może zawierać użytecznych danych, ale nie ma jeszcze EOF, a kiedy czyta się z niego, jest w EOF i odczyt nie powiedzie się.

Kolejnym ważnym szczegółem jest to, że operator>> dla strumieni pomija wszystkie znaki prowadzące, nie kończące się białymi znakami. Z tego powodu plik nie może znajdować się w EOF przed odczytem i znajdować się w EOF po przeczytaniu.

Dodatkowo ten pierwszy działa, gdy następne dane w pliku są danymi, których nie można odczytać w liczbie całkowitej (na przykład następne dane to x), a nie tylko w EOF, co jest bardzo ważne.

Przykład:

Rozważmy kod:

int x, y; 

f >> x; 

if (!f.eof()) 
    f >> y; 

Zakładając f jest plikiem, który zawiera dane 123␣ (the ␣ oznacza kosmiczne), pierwszy odczyt będzie się uda, ale potem pliku nie zawiera więcej liczb całkowitych i jest to , a nie w EOF. Drugi odczyt zakończy się niepowodzeniem, a plik pojawi się w EOF, ale nie wiesz, ponieważ przetestowałeś EOF przed próbą czytania. Następnie Twój kod powoduje niezdefiniowane zachowanie, ponieważ y jest niezainicjowany.

+0

Co masz na myśli? – Computernerd

+1

@Computernerd zobacz mój przykład. –

+0

Podoba mi się twoje wyjaśnienie. Jest prosty i łatwy do zrozumienia. – paddy

Powiązane problemy