Почему устанавливается failbit, когда при чтении обнаруживается eof?

Я читал, что предшествует < исключение> . Игнорируя тот факт, что исключения в fstream не очень информативны, у меня возникает следующий вопрос:

Можно включить исключения для файловых потоков с помощью метода exceptions () .

ifstream stream;
stream.exceptions(ifstream::failbit | ifstream::badbit);
stream.open(filename.c_str(), ios::binary);

Любая попытка открыть несуществующий файл, файл без правильных разрешений или любая другая проблема ввода-вывода приведет к исключению. Это очень хорошо, если использовать напористый стиль программирования. Файл должен был быть там и быть доступным для чтения. Если условия не выполняются, мы получаем исключение. Если бы я не был уверен, можно ли безопасно открыть файл, я мог бы использовать другие функции для его проверки.

Но теперь предположим, что я пытаюсь прочитать в буфер, например:

char buffer[10];
stream.read(buffer, sizeof(buffer)); 

Если поток обнаруживает конец -of-file перед заполнением буфера поток решает установить бит отказа , и возникает исключение, если они были включены. Зачем? какой в ​​этом смысл? Я мог бы убедиться, что просто протестировав eof () после чтения:

char buffer[10];
stream.read(buffer, sizeof(buffer));
if (stream.eof()) // or stream.gcount() != sizeof(buffer)
    // handle eof myself

Этот выбор дизайна не позволяет мне использовать стандартные исключения в потоках и заставляет меня создавать собственную обработку исключений для разрешений или ошибок ввода-вывода . Или я что-то упускаю? Есть ли выход? Например, могу ли я легко проверить, могу ли я прочитать sizeof (buffer) байтов в потоке, прежде чем делать это?

20
задан ceztko 25 February 2018 в 09:45
поделиться