Preciso ligar manualmente close()
quando uso um std::ifstream
?
Por exemplo, no código:
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");
}
Preciso ligar file.close()
manualmente? Não deve ifstream
usar o RAII para fechar arquivos?
close()
manualmente para tratamento de erros.Você precisa fechar o arquivo?
NÃO
Você deve fechar o arquivo?
Depende.
Você se preocupa com as possíveis condições de erro que podem ocorrer se o arquivo não fechar corretamente? Lembre-se de que fechar chamadas
setstate(failbit)
se falhar. O destruidor chamaráclose()
você automaticamente por causa do RAII, mas não permitirá que você teste o bit de falha, pois o objeto não existe mais.fonte
Eu concordo com @Martin. Se você gravar no arquivo, os dados ainda poderão estar em um buffer e poderão não ser gravados no arquivo até que
close()
sejam chamados. Sem fazer isso manualmente, você não tem idéia se houve um erro ou não. Não relatar erros para um usuário é uma prática muito ruim.fonte
Não, isso é feito automaticamente pelo
ifstream
destruidor. O único motivo pelo qual você deve chamá-lo manualmente é porque afstream
instância tem um grande escopo, por exemplo, se é uma variável membro de uma instância de classe longa vida.fonte
Você pode permitir que o destruidor faça seu trabalho. Mas, como qualquer objeto RAII, pode haver momentos em que fechar manualmente manualmente pode fazer a diferença. Por exemplo:
escreve o conteúdo do arquivo. Mas:
não. São casos raros em que um processo sai repentinamente. Um processo de falha pode fazer o mesmo.
fonte