Можете ли вы безопасно закрыть файл, который не был открыт?
Если у меня есть 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);
}