文件关闭后FILE指针会发生什么?

我希望知道文件关闭后FILE指针会发生什么。 它会是NULL吗?

基本上,我想在关闭文件之前检查文件是否已经关闭。

例如如下:

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

我可以这样做,还是有其他方法可以解决这个问题?

由于参数是按值传递的,因此fclose无法将文件指针设置为NULL 。 因为fclose可能会破坏你必须的FILE

  • 在执行fclose后手动将文件指针设置为NULL (如果在不同的函数中关闭它,则无法使用FILE **
  • 不要在你“ 忘记 ”你是否关闭它的情况下结束(可能很棘手)

Peter Norvig引用Auguste Comte (1798-1857):

  "Nothing is destroyed until it is replaced" 

你可以使用宏:

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

这解决了两个不同的和相反的问题:

  • fcl FILE *之后FILE *指针为NULL,因此不能两次fclose

  • 此版本的fclose 接受NULL参数。 fclose许多常见版本 – 例如HPUX,SGI和CYGWIN中的那些 – 对NULL感到满意。 奇怪的是FreeBSD启发的版本,如Linux和微软,不是。

当然,宏引入了自己的问题:

  • 它不会返回正确的错误值。 但是如果你想看到这个,可以用额外的括号禁用宏,如: if ((fclose)(fp) == EOF){ /* handle error... */ }

  • 它没有函数语义 ,因为它多次使用它的参数。 但很难想象这会导致问题。 但你可以使用(fclose) 。 或者将其命名为FCLOSE ,以遵循惯例。

FILE *它是一个指向FILE结构的指针,当你调用fclose()时它会破坏/释放FILE结构,但是不会改变FILE *指针的值意味着它仍然具有现在不退出的FILE结构的地址。

任何使用malloc的指针都会发生同样的事情

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

仍然不会是NULL

在大多数情况下,我总是这样做

 free(a); a=NULL; 

编辑:您无法在任何时候检查其是否已关闭/释放。 只是为了确保你可以在free / fclose之后将它分配为NULL,这样你就可以检查它的NULL,然后继续..

是的,你可以做到这一点。 更好的方法是将fp设置为NULL else

它将是悬空指针(一个指向它不拥有或不存在的东西的指针)