¿Debo llamar manualmente close()
cuando uso un std::ifstream
?
Por ejemplo, en el 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");
}
¿Necesito llamar file.close()
manualmente? ¿No debería ifstream
hacer uso de RAII para cerrar archivos?
close()
manualmente para el manejo de errores.¿Necesitas cerrar el archivo?
NO
¿Deberías cerrar el archivo?
Depende
¿Le preocupan las posibles condiciones de error que podrían ocurrir si el archivo no se cierra correctamente? Recuerde que cierra las llamadas
setstate(failbit)
si falla. El destructor lo llamaráclose()
automáticamente debido a RAII pero no le dejará una forma de probar el bit de falla ya que el objeto ya no existe.fuente
Estoy de acuerdo con @Martin. Si escribe en el archivo, es posible que los datos permanezcan en un búfer y no se escriban en el archivo hasta que
close()
se llame. Sin hacerlo manualmente, no tiene idea de si hubo un error o no. No informar errores a un usuario es una muy mala práctica.fuente
No, esto lo hace automáticamente el
ifstream
destructor. La única razón por la que debe llamarlo manualmente es porque lafstream
instancia tiene un gran alcance, por ejemplo, si es una variable miembro de una instancia de clase de larga vida.fuente
Puede permitir que el destructor haga su trabajo. Pero al igual que cualquier objeto RAII, puede haber ocasiones en que las llamadas cerradas manualmente puedan marcar la diferencia. Por ejemplo:
escribe el contenido del archivo. Pero:
no lo hace Estos son casos raros en los que un proceso sale repentinamente. Un proceso de bloqueo podría hacer algo similar.
fuente