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

Ifstream:: is_open vs ifstream:: fail?

Решение проблемы чтения Savich в С++, std::ifstream::fail показано в качестве примера, чтобы проверить, правильно ли открыт файл (ifstream или ofstream).

Я ранее использовал, так как это то, что я впервые показал, std::ifstream::is_open для выполнения той же проверки.

Какая "лучшая" практика?

Или в том случае, если либо вызывается непосредственно после попытки открыть, не имеет практической разницы?

4b9b3361

Ответ 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.

Ответ 2

Вместо этого используйте оператор преобразования bool!

ifstream i("test.txt");
if (i) {
    //success
}

Или лучше:

ifstream i("test.txt");
if (!i) {
    //failure, handle error
}