2010-02-12 11 views
28

Wie überprüfe ich für das Ende der Datei mit der std::getline Funktion? Wenn ich eof() verwende, wird es eof nicht signalisieren, bis ich versuche, über das Ende der Datei hinaus zu lesen.Prüfung auf eof in string :: getline

+0

Das 'eof' nicht empfohlen wird, ist wahr, aber aus einem anderen Grund. Das Lesen von EOF ist * genau * was Sie tun, wenn Sie EOF testen wollen, also funktioniert 'eof' gut in dieser Hinsicht. –

Antwort

9

Nur lesen und prüfen Sie, ob der Lesevorgang erfolgreich:

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

Da der Ausfall einer Reihe von Ursachen zurückgeführt werden kann, können Sie die eof Member-Funktion verwenden, um zu sehen, was EOF passiert ist, war eigentlich:

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

getline liefert den Strom, so dass Sie mehr kompakt schreiben:

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

Die kanonische Leseschleife in C++ ist:

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

Diese Antwort ist einfach großartig. Wenn Sie Fehlermeldungen benötigen, ist dies der (einzige) Weg. Es braucht wirklich Zeit, das herauszufinden: http://gehrcke.de/2011/06/reading-files-in-c-using-ifstream-dealing-correctly-with-badbit-failbit-eofbit-and-perror/ –