2011-12-09 10 views

Respuesta

10

Como los argumentos se pasan por valor, no hay manera de que fclose pueda establecer su puntero de archivo en NULL. Desde fclose probablemente destruye el FILE tienes que

  • establecer manualmente el puntero del archivo a NULL después de hacer un fclose (no funcionará si se cierra en una función diferente unles utiliza FILE **)
  • no lo hacen terminar en una situación en la que "olvida" si lo ha cerrado o no (puede ser complicado)
+0

En ese caso, ¿cómo puedo averiguar si el archivo ya se ha cerrado o no? – CuriousCoder

+0

Configúrelo en 'NULL' después de cerrarlo ... –

2

ARCHIVO * es un puntero a una estructura de archivos, cuando se llama a fclose() que va a destruir/gratuita Estructura de archivo pero no cambiará el valor del puntero FILE * significa que aún tiene la dirección de esa estructura FILE que ahora no está abierta.

mismas cosas happem con cualquier puntero conseguir con malloc

int a malloc(10); 
free(a); 

todavía no será nulo

en la mayoría de casos siempre lo hago estas cosas

free(a); 
a=NULL; 

Editar: No se puede verificar si está CERRADO/liberado en cualquier momento. solo para asegurarse de que puede asignarlo NULL después de libre/fclose para que pueda verificar su NULL o no y continuar ...

0

Sí, puede hacerlo. y la mejor manera es establecer fp a NULL demás

que se colgaba puntero (un puntero que está apuntando a algo que no le pertenece, o que no existe)

5

Peter Norvig cotizaciones Auguste Comte (1898-57):

"Nothing is destroyed until it is replaced" 

Se podría utilizar la macro:

#define fclose(fp) ((fp) ? fclose(fp) : 0, (fp) = 0) 

Esto fija dos problemas diferentes y opuestas:

  • El puntero FILE * se NULL'd después de fclose, por lo que no se puede fclose'd dos veces.

  • Esta versión de fcloseaceptará un argumento NULO. Muchas versiones de fclose, como las de HPUX, SGI y CYGWIN, son felices con NULL. Es extraño que las versiones inspiradas en FreeBSD como en Linux, y Microsoft, no lo son.

Por supuesto, la macro presenta sus propios problemas:

  • No devuelve el valor de error adecuado. Pero si quería ver esto, puede deshabilitar la macro con paréntesis adicionales, como en: if ((fclose)(fp) == EOF){ /* handle error... */ }

  • no tiene la semántica de función , ya que utiliza sus argumentos varias veces. Pero es difícil imaginar que esto cause un problema. Pero puede usar (fclose). O nómbrelo FCLOSE, para seguir la convención.

Cuestiones relacionadas