Я читал, что <fstream>
предшествует <exception>
. Игнорируя тот факт, что исключения на 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));
Если поток определяет конец файла перед заполнением буфера, поток решает установить failbit
, и исключение запускается, если они были включены. Зачем? Какой смысл? Я мог бы проверить, что просто тестирование eof()
после чтения:
char buffer[10];
stream.read(buffer, sizeof(buffer));
if (stream.eof()) // or stream.gcount() != sizeof(buffer)
// handle eof myself
Этот выбор дизайна не позволяет мне использовать стандартные исключения в потоках и заставляет меня создавать свою собственную обработку исключений при разрешении или ошибках ввода-вывода. Или я чего-то не хватает? Есть ли выход? Например, могу ли я легко проверить, могу ли я читать sizeof(buffer)
байты в потоке, прежде чем делать это?