2010-02-12 15 views
28

Jak sprawdzić koniec pliku przy użyciu funkcji std::getline? Jeśli użyję eof(), nie będę sygnalizować eof, dopóki nie spróbuję odczytać poza końcem pliku.sprawdzanie ciągu znaków w ciąg :: getline

+0

że 'eof' nie jest zalecana jest prawdą, ale z innego powodu. Czytanie przeszłości EOF to * dokładnie * to, co robisz, gdy chcesz przetestować EOF, więc 'eof' działa dobrze w tym względzie. –

Odpowiedz

9

Wystarczy przeczytać, a następnie sprawdzić, że operacja odczytu udało:

std::getline(std::cin, str); 
if(!std::cin) 
{ 
    std::cout << "failure\n"; 
} 

Ponieważ awaria może być spowodowana różnymi przyczynami, można użyć funkcji eof member aby zobaczyć to, co się stało, było rzeczywiście EOF:

std::getline(std::cin, str); 
if(!std::cin) 
{ 
    if(std::cin.eof()) 
     std::cout << "EOF\n"; 
    else 
     std::cout << "other failure\n"; 
} 

getline zwraca strumień tak można napisać bardziej zwięźle:

if(!std::getline(std::cin, str)) 
39

Kanoniczna pętla odczyt w C++ jest:

while (getline(cin, str)) { 

} 

if (cin.bad()) { 
    // IO error 
} else if (!cin.eof()) { 
    // format error (not possible with getline but possible with operator>>) 
} else { 
    // format error (not possible with getline but possible with operator>>) 
    // or end of file (can't make the difference) 
} 
+1

Ta odpowiedź jest wspaniała. Jeśli potrzebujesz komunikatów o błędach, jest to (jedyna) droga. Naprawdę potrzeba czasu, aby to zrozumieć: http://gehrcke.de/2011/06/reading-files-in-c-using-ifstream-dealing-correctly-with-badbit-failbit-eofbit-and-perror/ –

Powiązane problemy