Ответ 1
Вы очень, очень редко хотите проверить плохое, эф и добро. В частности, для eof (as! 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() неверно назван и не эквивалентен тестированию самого потока (что видно из приведенных выше примеров).