Si el archivo se abre con fopen() y en un modo diferente, ¿es necesario cerrarlo varias veces o se puede cerrar una vez al final del código?
Cada vez que abra el archivo, recibirá diferentes descriptores de archivo o identificadores de archivo. Por lo tanto, debe cerrar cada controlador de archivo usando fclose() si se abre a través de fopen() o close() si se abre a través open() .
La función open es la primitiva subyacente de las funciones fopen y freopen , que crean secuencias.
int open (const char *filename, int flags[, mode_t mode]) que crea y devuelve un nuevo descriptor de archivo para el archivo nombrado por filename . El mode de argumento se usa solo cuando se crea un archivo, pero no está de más proporcionar el argumento en cualquier caso.
Por lo tanto, cada vez que se llama un archivo open o fopen , se crea un nuevo descriptor de archivo y estos descriptores permanecen asignados hasta que finaliza el programa.
La función close o fclose cierra los campos del descriptor de archivo. Cerrar un expediente tiene las siguientes consecuencias:
Si open o fopen y no close , ese descriptor no se limpiará y persistirá hasta que se cierre el programa.
El problema será grave si hay muchas llamadas open o cualquier archivo puede abrirse potencialmente varias veces (sin cerrar cada vez), entonces los descriptores se filtrarán , hasta que el sistema operativo se niegue o no pueda crear otro descriptor, en en cuyo caso, la llamada a fopen falla y el programa puede fallar.
En la mayoría de los sistemas operativos POSIX, incluidos Linux y Os X, a cada proceso se le asigna una tabla fija de identificadores de archivos o descriptores de archivos. Por lo general, se trata de 1024 identificadores. Cuando intenta abrir el descriptor de archivo 1025, el sistema operativo elimina su proceso.
El problema es casi seguro que está filtrando identificadores de archivos. Es decir, las manijas se abren y, una vez que haya terminado con ellas, no se cierran.
Para evitar la fuga del descriptor, debe close o fclose antes de volver a abrir un archivo cada vez.
Eche un vistazo a lo que GNU describió sobre la apertura y el cierre de archivos .
Tienes que cerrarlos todos.
Cuando usa llamadas al sistema de familia open , le devuelven un file-descriptor ( fopen devuelve FILE* que es básicamente una estructura que contiene el descriptor de archivo. Eche un vistazo a la definición de ARCHIVO).
typedef struct { short level ; short token ; short bsize ; char fd ; <-- here unsigned flags ; unsigned char hold ; unsigned char *buffer ; unsigned char * curp ; unsigned istemp; }FILE ; Como resultado fopen() le dará dos ARCHIVOS* diferentes (y descriptores de archivo diferentes obviamente) que debería close()/fclose() finalmente.