Много, много рядко искате да проверите лошо, eof и добро. По-специално за eof (тъй като !stream.eof() е често срещана грешка), потокът, който в момента е в EOF, не означава непременно, че последната операция за въвеждане е неуспешна; обратното, липсата на EOF не означава, че последното въвеждане е било успешно.
Всички функции за състоянието на потока – fail, bad, eof и good – ви казват текущото състояние на потока, вместо да предсказват успеха на бъдеща операция. Проверете самия поток (което е еквивалентно на обратна проверка за грешка) след желаната операция:
if (getline(stream, line)) {
use(line);
}
else {
handle_error();
}
if (stream >> foo >> bar) {
use(foo, bar);
}
else {
handle_error();
}
if (!(stream >> foo)) { // operator! is overloaded for streams
throw SomeException();
}
use(foo);
За да прочетете и обработите всички редове:
for (std::string line; getline(stream, line);) {
process(line);
}
Трябва да се каже, че good() е погрешно наречен и не е еквивалентен на тестване на самия поток (което правят горните примери).
person
Fred Nurk
schedule
01.12.2010
.good()
,.eof()
,.fail()
), за да предвидите успеха на бъдещи операции за четене (напр.getline
,>>
). Това не работи, защото състоянието на потока ви казва дали предишна операция за четене е неуспешна / достигнала края на входа; не ви казва нищо за бъдещи опити за четене. - person melpomene   schedule 04.05.2019