Нужно ли мне вручную звонить, close()
когда я использую std::ifstream
?
Например, в коде:
std::string readContentsOfFile(std::string fileName) {
std::ifstream file(fileName.c_str());
if (file.good()) {
std::stringstream buffer;
buffer << file.rdbuf();
file.close();
return buffer.str();
}
throw std::runtime_exception("file not found");
}
Нужно ли звонить file.close()
вручную? Не следует ifstream
использовать RAII для закрытия файлов?
close()
вручную для обработки ошибок.Вам нужно закрыть файл?
НЕТ
Вы должны закрыть файл?
Смотря как.
Вы заботитесь о возможных условиях ошибки, которые могут возникнуть, если файл не закрывается правильно? Помните, что закрыть звонки,
setstate(failbit)
если это не удается Деструктор будет вызыватьclose()
вас автоматически из-за RAII, но не оставит вам способа проверить бит сбоя, поскольку объект больше не существует.источник
Я согласен с @Martin. Если вы записываете в файл, данные могут все еще находиться в буфере и могут не записываться в файл, пока не
close()
будет вызван. Не делая этого вручную, вы не представляете, произошла ошибка или нет. Не сообщать пользователю об ошибках - очень плохая практика.источник
Нет, это делается автоматически
ifstream
деструктором. Единственная причина, по которой вы должны вызывать его вручную, заключается в том, чтоfstream
экземпляр имеет большую область видимости, например, если это переменная-член экземпляра класса с длительным сроком службы.источник
Вы можете позволить деструктору делать свою работу. Но, как и в случае любого объекта RAII, иногда вызовы close могут иметь значение. Например:
записывает содержимое файла Но:
не делает. Это редкие случаи, когда процесс внезапно завершается. Процесс сбоя может сделать то же самое.
источник