Подтвердить что ты не робот

Можете ли вы получить определенное условие ошибки при открытии потока С++?

Есть ли способ получить конкретное условие ошибки при открытии потока С++? То есть, не удалось ли это, потому что файл не существовал, или разрешения были неправильными, или т.д. В основном я ищу функциональность, эквивалентную errno для fopen() в простой C.

GCC, похоже, правильно устанавливает errno, но это не похоже на стандарт С++, и я не могу определить, является ли это просто артефактом того, как они реализовали потоки, или преднамеренной функцией (и, следовательно, я не знаю, будет ли он сохраняться в разных версиях).

Есть ли способ получить эту информацию надежно, либо в стандартном С++, либо не случайно в одном или нескольких основных компиляторах?

4b9b3361

Ответ 1

Вы можете посмотреть флагов ios (badbit, eofbit, failbit, goodbit) по общим причинам. Тестирование будет проще с помощью ios:: bad(), ios:: fail(), ios:: eof() или ios:: good(). Поток также может быть установлен для генерации исключений при ошибке, используя ios:: exceptions().

Подробные отчеты об ошибках ввода-вывода могут быть доступны в некоторых реализациях, поскольку вы указываете на GCC. Возможно, вам придется полагаться на это поведение для разных компиляторов. Если есть вероятность для нескольких компиляторов, убедитесь, что вы проверили и, вероятно, включили инструкции препроцессора для проверки текущего компилятора и т.д.
Насколько я знаю, единственное другое место, которое он обсуждал, находится в предлагаемых дополнениях TR2.

Ответ 2

В Visual Studio fopen и т.п. установите значение кода последней ошибки. Его можно найти с помощью GetLastError(). Результатом будет один из эти значения.