2011-12-09 6 views

risposta

10

Poiché gli argomenti vengono passati per valore, non è possibile che fclose imposti il ​​puntatore del file su NULL. Dal momento che fclose distrugge probabilmente il FILE bisogna

  • impostare manualmente il puntatore del file NULL dopo aver fatto un fclose (non funzionerà se lo si chiude in una funzione diversa unles si utilizza FILE **)
  • non lo fanno finire in una situazione in cui si "dimentica" se è stata chiusa o no (potrebbe essere difficile)
+0

In tal caso, come posso sapere se il file è già stato chiuso o meno. – CuriousCoder

+0

Impostalo su 'NULL' dopo averlo chiuso ... –

2

FILE * e 'un puntatore ad una struttura di file, quando si chiama fclose() distruggerà/gratuito Struttura FILE ma non cambierà il valore del puntatore FILE * significa che ha ancora l'indirizzo di quella struttura FILE che ora non è uscito.

stesse cose happem con qualsiasi puntatore ottenendo con malloc

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

ancora non sarà NULL

nella maggior parte dei casi ho sempre fare queste cose

free(a); 
a=NULL; 

Edit: non è possibile controllare se è CHIUSO/liberato in qualsiasi momento. solo per assicurarti di poterlo assegnare NULL dopo free/fclose in modo da poterne controllare il NULL o no e andare avanti ..

0

Sì, puoi farlo. e il modo migliore è quello di impostare fp-NULL altro

sarà penzolante puntatore (un puntatore, che sta puntando a qualcosa che non possiede o che non esiste)

5

Peter Norvig citazioni Auguste Comte (1798-1857):

"Nothing is destroyed until it is replaced" 

Si potrebbe utilizzare la macro:

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

Questo risolve due diverse e contrapposte problemi:

  • Il puntatore FILE * è NULL'd dopo fclose, quindi non può essere fclose'd due volte.

  • Questa versione di fcloseaccetta un argomento NULL. Molte versioni comuni di fclose - come quelle di HPUX, SGI e CYGWIN - sono felici con NULL. È strano che le versioni ispirate a FreeBSD come in Linux, e Microsoft, non lo siano.

Naturalmente, la macro presenta i suoi problemi:

  • Esso non restituisce il valore di errore corretto. Ma se si voleva vedere questo, è possibile disattivare la macro con parentesi in più, come in: if ((fclose)(fp) == EOF){ /* handle error... */ }

  • non ha semantica funzione, in quanto utilizza il suo argomento più volte. Ma è difficile immaginare che questo causi un problema. Ma puoi usare (fclose). O chiamalo FCLOSE, per seguire la convenzione.