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

时间:2011-12-09 04:26:37

标签: c file fclose

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

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

例如如下:

FILE *f;

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

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

4 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:7)

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,因此不能 fclose'd两次。

  • 此版本的fclose 接受NULL参数。很常见 fclose的版本 - 例如HPUX,SGI和CYGWIN中的版本 - 很高兴 用NULL。奇怪的是FreeBSD启发的版本,比如在Linux中, 和微软,不是。

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

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

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

答案 2 :(得分:2)

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

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

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

仍然不会为NULL

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

free(a);
a=NULL;

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

答案 3 :(得分:0)

是的,你可以这样做。更好的方法是将fp设置为NULL 其他

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