Можете ли вы получить конкретную ошибку при сбое открытия потока C ++? - PullRequest
13 голосов
/ 20 ноября 2008

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

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

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

Ответы [ 2 ]

4 голосов
/ 20 ноября 2008

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

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

0 голосов
/ 20 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...