studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones c++ file filestreams

c++ - programacion - ¿Qué sucede si nunca llamo a "cerrar" en un flujo de archivos abierto?



manual de programacion android pdf (4)

Esta pregunta ya tiene una respuesta aquí:

A continuación se muestra el código para el mismo caso.

#include <iostream> #include <fstream> using namespace std; int main () { ofstream myfile; myfile.open ("example.txt"); myfile << "Writing this to a file./n"; //myfile.close(); return 0; }

¿Cuál será la diferencia si myfile.close() el comentario de la línea myfile.close() ?


En condiciones normales no hay diferencia.

PERO en condiciones excepcionales (con un ligero cambio), la llamada a cerrar puede provocar una excepción.

int main() { try { ofstream myfile; myfile.exceptions(std::ios::failbit | std::ios::badbit); myfile.open("example.txt"); myfile << "Writing this to a file./n"; // If you call close this could potentially cause an exception myfile.close(); // On the other hand. If you let the destructor call the close() // method. Then the destructor will catch and discard (eat) the // exception. } catch(...) { // If you call close(). There is a potential to get here. // If you let the destructor call close then the there is // no chance of getting here. } }


En este caso, no ocurrirá nada y el tiempo de ejecución del código es muy inferior.

Sin embargo, si sus códigos se ejecutan durante mucho tiempo cuando está abriendo archivos continuamente y no los está cerrando, después de un cierto tiempo, es posible que se bloquee el tiempo de ejecución.

cuando abre un archivo, el sistema operativo crea una entrada para representar ese archivo y almacenar la información sobre ese archivo abierto. Entonces, si hay 100 archivos abiertos en su sistema operativo, habrá 100 entradas en el sistema operativo (en algún lugar del núcleo). Estas entradas están representadas por enteros como (... 100, 101, 102 ...). Este número de entrada es el descriptor de archivo. Por lo tanto, es solo un número entero que representa de forma única un archivo abierto en el sistema operativo. Si su proceso abre 10 archivos, entonces su tabla de Procesos tendrá 10 entradas para los descriptores de archivos.

Además, es por esto que puede quedarse sin descriptores de archivos, si abre muchos archivos a la vez. Lo que evitará que los sistemas * nix se ejecuten, ya que abren descriptores para rellenar en / proc todo el tiempo.

Algo similar debería ocurrir en el caso de todos los sistemas operativos.


No hay diferencia. El destructor de la secuencia de archivos cerrará el archivo.

También puede confiar en el constructor para abrir el archivo en lugar de llamar a open() . Su código se puede reducir a esto:

#include <fstream> int main() { std::ofstream myfile("example.txt"); myfile << "Writing this to a file./n"; }


Para fortalecer la respuesta de juanchopanza con alguna referencia de la documentación std::fstream

(incinerador de basuras)
[virtual] (declarado implícitamente)

destruye basic_fstream y el búfer asociado, cierra el archivo (función de miembro público virtual)