2011-12-09 69 views
9

我想知道文件關閉後FILE指針會發生什麼。它會是NULL嗎?文件關閉後FILE指針會發生什麼?

基本上,我想在關閉文件之前檢查一個文件是否已經關閉。

舉例如下:

FILE *f; 

if(f!=NULL) 
{ 
    fclose(f); 
} 

我能做到這一點,還是有其他的路要走呢?

回答

10

由於參數是按值傳遞的,所以沒有辦法fclose可以將文件指針設置爲NULL。由於fclose可能破壞FILE你必須

  • 手工做fclose(如果你關閉它在不同的功能unles您使用FILE **將無法​​正常工作)
  • 別後的文件指針設置爲NULL最終在一個情況下,你「忘記」無論你將其關閉或沒有(可能是棘手)
+0

在這種情況下,我該如何找出文件是否已經關閉或沒有。 – CuriousCoder

+0

關閉後將其設置爲「NULL」... –

2

FILE *這是一個指向文件的指針結構,當你調用FCLOSE(),它會破壞/免費FILE結構但不會改變FILE *指針的值意味着它仍然具有那個現在不存在的FILE結構的地址。

同樣的事情與任何指針使用malloc

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

仍然得到happem一個不會在大多數情況下,NULL

我總是做這樣的事情

free(a); 
a=NULL; 

編輯:你不能隨時檢查它是否已關閉/釋放。只是爲了確保您可以在free/fclose之後將它分配爲NULL,以便您可以檢查其是否爲NULL並繼續。

0

是的,您可以這樣做。更好的方法是設置fpNULL 其他

將懸掛指針(它指向的東西,它不擁有或不存在的指針)

5

Peter Norvig報價Auguste Comte(1798年至1857年):

"Nothing is destroyed until it is replaced" 

你可以使用宏:

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

這修復不同和相對的問題:

  • FILE *指針fclose後NULL'd,所以它不能是 fclose'd兩次。

  • 此版本的fclose接受NULL參數。 fclose的許多常見 版本 - 如HPUX,SGI和CYGWIN中的那些版本 - 很樂意帶有NULL的 。奇怪的是FreeBSD啓發的版本,如Linux, 和微軟,都沒有。

當然,宏推出了自己的問題:

  • 它不返回正確的錯誤值。但是,如果你想看到 這一點,你可以用額外的括號禁用宏,如:if ((fclose)(fp) == EOF){ /* handle error... */ }

  • 它沒有功能的語義,因爲它使用它的參數 多次。但很難想象這會造成問題。但是你可以使用(fclose)。或者將其命名爲FCLOSE,遵循慣例。

相關問題