write open example ejemplo definicion c++ std fstream ofstream

open - readfile c++



¿Necesito cerrar un std:: fstream? (3)

Creo que es una buena práctica cerrar su flujo de datos, ya que necesita vaciar el búfer, que lo que me han dicho

Posible duplicado:
¿Necesito cerrar manualmente un ifstream?

¿Debo llamar a fstream.close() o fstream es un objeto RAII adecuado que cierra el flujo al destruirlo?

Tengo un objeto std::ofstream local dentro de un método. ¿Puedo suponer que el archivo siempre se cierra después de salir de este método sin llamar al cierre? No pude encontrar la documentación del destructor.


Creo que las respuestas anteriores son engañosas.

fstream es un objeto RAII adecuado, se cierra automáticamente al final del alcance, y no hay absolutamente ninguna necesidad de llamar a close manualmente cuando el cierre al final del alcance es suficiente.

En particular, no es una "mejor práctica" y no es necesario limpiar la salida.

Y mientras Drakosha tiene razón en que el close llamadas le da la posibilidad de verificar el bit de falla de la transmisión, de todos modos, nadie hace eso.

En un mundo ideal, uno simplemente llamaría a stream.exception(ios::failbit) antemano y manejaría la excepción que se produce en el fstream un fstream . Pero, desafortunadamente, las excepciones en los destructores son un concepto roto en C ++, por lo que no es una buena idea.

Entonces, si desea verificar el éxito de cerrar un archivo, hágalo manualmente (pero solo entonces).


Para adjuntar a la respuesta de Amy Lee, es mejor hacerlo manualmente porque de esta manera usted también puede verificar si hay errores.

Por cierto, según la página de manual "cerrar" :

No verificar el valor de retorno de close () es un error de programación común pero no obstante grave . Es muy posible que los errores en una operación anterior de escritura (2) se informen primero en el cierre final (). No comprobar el valor de retorno al cerrar el archivo puede provocar una pérdida silenciosa de datos. Esto se puede observar especialmente con NFS y con la cuota de disco.

Un cierre exitoso no garantiza que los datos se hayan guardado exitosamente en el disco , como lo escribe el kernel. No es común que un sistema de archivos vacíe los buffers cuando la secuencia está cerrada. Si necesita asegurarse de que los datos se almacenan físicamente, utilice fsync (2). (Dependerá del hardware del disco en este punto).