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
Antwort
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))
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)
}
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/ –
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. –