Pregunta

¿Debo llamar manualmente close() cuando utilizo 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");
}

¿Debo llamar file.close() manualmente? no debe hacer uso de ifstream RAII para el cierre de archivos?

¿Fue útil?

Solución

NO

Esto es lo que es para RAII, que el destructor haga su trabajo. No hay ningún daño en el cierre de forma manual, pero no es la forma en C ++, que es la programación en C con las clases.

Si desea cerrar el archivo antes de que el final de una función que siempre puede utilizar un ámbito anidado.

En la norma (basic_ifstream plantilla 27.8.1.5 Clase), ifstream es para ser implementado con un miembro de basic_filebuf sostiene el mango de archivo real. Se lleva a cabo como miembro de manera que cuando un objeto se ifstream destruye, sino que también llama al destructor de basic_filebuf. Y a partir de la norma (27.8.1.2), que cierra el destructor de archivos:

  

virtual ˜basic_filebuf();

     

Efectos: Destruye un objeto de basic_filebuf<charT,traits> clase. Las llamadas close().

Otros consejos

¿Es necesario cerrar el archivo?
NO

En caso de que cierre el archivo?
Depende.

¿Se preocupa por las posibles condiciones de error que podrían ocurrir si el archivo no se cierra correctamente? Recuerde que las llamadas de cierre setstate(failbit) si falla. El destructor llamará close() de forma automática debido a RAII , pero no te dejará una manera de probar el bit fallan como el objeto ya no existe.

Estoy de acuerdo con @ Martin. Si se escribe en el archivo, los datos aún puede estar sentado en una memoria intermedia y puede que no se escriben en el archivo hasta que close() se llama. Sin hacerlo de forma manual, no tiene ni idea de si hubo un error o no. No informar de los errores de un usuario es una muy mala práctica.

No, esto se hace automáticamente por el destructor ifstream. La única razón por la que debe llamar de forma manual, se debe a la instancia fstream tiene un gran alcance, por ejemplo, si se trata de una variable miembro de una instancia de la clase larga vida.

Puede permitir que el destructor para hacer su trabajo. Pero al igual que cualquier objeto RAII puede haber ocasiones en que llamar estrecha manualmente puede marcar la diferencia. Por ejemplo:

#include <fstream>

using std::ofstream;

int main() {
  ofstream ofs("hello.txt");
  ofs << "Hello world\n";
  return 0;
}

escribe el contenido del archivo. Pero:

#include <stdlib.h>

#include <fstream>

using std::ofstream;

int main() {
  ofstream ofs("hello.txt");
  ofs << "Hello world\n";
  exit(0);
}

no lo hace. Estos son casos raros en los que un proceso sale de repente. Un proceso de estrellarse podía hacer semejante.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top