Если я создаю объект std::ofstream, передавая строку, четко ли он определен для тестирования самого объекта? Кажется, я не могу найти однозначный ответ, поскольку оба, похоже, используются.
В документации говорится, что объект создается, а затем открывается, когда я использую этот конструктор, а затем устанавливаются определенные биты, если он терпит неудачу.
то есть
std::ofstream File("Cannotcreate");
if (!File){
std::cerr << "error opening \n";
}
против.
std::ofstream File("Cannotcreate");
if (!File.is_open()){
std::cerr << "error opening \n";
}
Является ли первый способ столь же действенным?





Конструктор с инициализацией действительно создаст объект std::ofstream и попытается открыть файл. Если что-то повреждает поток и переводит его в недопустимое состояние, не готовое к операциям ввода/вывода, будут установлены флаги ошибок (плохой бит, бит отказа, ...).
std::ofstream File("Cannotcreate");
if (!File){
std::cerr << "error opening \n";
}
В приведенном выше примере вы фактически приводите объект std::ofstream к логическому значению (оператору!), который проверяет наличие каких-либо флагов ошибок. Если установлен какой-либо из флагов (плохой бит, бит отказа), он возвращает true (поток не готов к использованию и поврежден). Оно эквивалентно выражению !fail() (возвращает противоположность тому, что возвращает метод Fail).
std::ofstream File("Cannotcreate");
if (!File.is_open()){
std::cerr << "error opening \n";
}
Другой пример вызывает метод is_open и проверяет только то, открыт ли файл. Данный метод не выполняет никаких проверок внутреннего состояния потока, а служит только для проверки наличия связанного файла.
Если вы только проверяете, открыт ли файл, оба способа одинаково действительны.
Какая может быть практическая причина того, что !file и !file.is_open() имеют разные значения сразу после создания потока?
Определите «одинаково действительный». Второй выдаст сообщение об ошибке только в случае невозможности открытия файла (если только вы не напишете дополнительный код для проверки других условий ошибки). Первый выдаст сообщение об ошибке при возникновении какой-либо ошибки в потоке (невозможность открыть файл — это только один тип ошибки из нескольких — есть и другие), но не предоставит информацию о том, какая ошибка произошла.