Вы очень, очень редко хотите проверять плохие, плохие и хорошие. В частности, для 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