Можете ли вы безопасно закрыть файл, который не был открыт?

Если у меня есть std::ofstream, который может быть или не быть открыт, безопасно ли пытаться close независимо? В других словах close() делать что-нибудь противное (исключение и т.д.), Если !is_open(). Например

std::ofstream out;
if (some_condition)
{
    out.open(path, std::ios::out);
}

После того как я закончил с файлом, могу ли я просто сказать

out.close();

Или сначала нужно проверить

if (out.is_open())
    out.close();

Единственное описание std::basic_fstream::close в cppreference -

Закрывает связанный файл.
Эффективно вызывает rdbuf()->close(). Если во время работы возникает ошибка, вызывается setstate(failbit).

Ответ 1

Он делает именно то, что говорит cppreference: он будет установлен, и вы можете проверить его с помощью метода fail(). Например, следующие отпечатки "fail\n":

#include <iostream>
#include <fstream>
int main(int argc, char ** argv)
{
        std::ofstream out;
        out.close();
        if (out.fail())
                std::cout << "fail" << std::endl;
        return 0;
}

Что касается взаимодействия с операционной системой, там ничего не может быть закрыто, но это в противном случае безвредно.

Ответ 2

Из стандарта С++, раздел 27.9.1.4 [filebuf.members], пункт 6:

basic_filebuf<charT,traits>* close();
     Эффекты: Если is_open() == false, возвращает нулевой указатель. & Hellip;

Ответ 3

Да, вы можете close() всегда хранить файл, даже файл не открывается. Неважно, LINUX или Windows, я всегда close(), не думая, что они открыты или нет.

От LINUX:

void
close()
{
     if (!_M_filebuf.close())
        this->setstate(ios_base::failbit);
}