Что является лучшим способом получить значимые сообщения об ошибках доступа к файлу портативным способом от станд.:: fstreams? Примитивность badbits
и failbits
получение должно быть разрядным раздражением. Я записал свои собственные иерархии исключения против win32 и POSIX прежде, и это было намного более гибко, чем способ, которым STL делает это.
Я становлюсь "основным:: ios_clear" как сообщение об ошибке от what
метод выгоды downcasted (std::exception
) из a fstream
которому включили исключения. Это не значит много для меня, хотя я действительно знаю то, что проблема, я хотел бы, чтобы моя программа была немного более информативной так, чтобы, когда я запускаю развертывание несколько месяцев спустя, моя жизнь была легче.
Есть ли что-либо в Повышении для извлечения значимых сообщений из fstream
реализация кросс-платформенная и перекрестная реализация STL?
Никто не мешает вам также проверять errno
/strerror
(например, в обработчике исключений) по более конкретной причине сбоя.
Кстати, реализация fstream
IIRC Visual Studio вызывает _open
/_read
/_write
/etc. Методы ЭЛТ, которые устанавливают errno
. Корпорация Майкрософт не дает никаких гарантий того, что GetLastError
по-прежнему содержит правильное значение после возврата методов CRT. Idem для реализаций cygwin, mingw и т.д., которые устанавливают errno
без каких-либо претензий или гарантий в отношении GetLastError
.
Поэтому я поддерживаю мое утверждение, что все, что вам нужно, может, и поэтому хочу сделать это проверить errno
.
Теперь, учитывая все вышесказанное, если вы все еще хотите усложнить свою жизнь и переинженер, используя Boost::System
вместо того, чтобы просто называть strerror
, то я думаю, что мое определение и ваше определение элегантности и простоты не одно и то же. :)
Какая информация вам нужна? badbit
указывает на ошибку ввода-вывода. eofbit
указывает eof. бит отказа
указывает на ошибку синтаксического анализа.
В любом случае, чтобы исключить одно решение, я не думаю, что вы можете переопределить функции ввода собственного типа из-за ADL. Вы можете реализовать оператор >> (istream, input_safe_int)
, где input_safe_int
создается из int &
. Поместите внутри блок try
и т. Д.