Я читал, что
предшествует < исключение>
. Игнорируя тот факт, что исключения в 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)
байтов в потоке, прежде чем делать это?