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.
[this] (http://stackoverflow.com/questions/6512173/ifstream-not-reading-eof-character) i wiele innych. – Rapptz