Ответ 1
Введение
std::ifstream::fail
включает проверку std::ifstream::is_open
, но std::ifstream::is_open
проверяет, возможно ли создать дескриптор файла.
ОБЪЯСНЕНИЕ
std::ifstream::fail
может возвращать true, даже если std::ifstream::is_open
возвращает true; они не являются взаимоисключающими.
.fail
проверит общее "здоровье" потока, которое включает такие вещи, как проверка того, что поток в настоящее время ввел состояние отказа из попытки прочитать недопустимое значение, тогда как .is_open
будет проверять, является ли поток в настоящее время прикрепленный к файлу, .is_open
не заботится, находится ли поток в состоянии сбоя или нет.
ЧТО ЛУЧШАЯ ПРАКТИКА?
Это, безусловно, зависит от того, что вы пытаетесь выполнить.
Обычно рекомендуется полагаться на explicit operator bool ()
, чтобы узнать, готов ли поток к чтению/записи. Это включает проверку общего состояния потока.
Можно ли сделать еще одну операцию чтения/записи на some_stream
?
if (some_stream) {
// stream is alive and well
} else {
// something is wrong
}
Если вы явно хотите увидеть, действительно ли какой-либо файл fstream прикреплен к файлу, используйте is_open
, и если вы хотите проверить общее состояние здоровья; используйте .fail
или полагайтесь на то, что поток можно преобразовать в bool
.