12

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

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

例如如下:

FILE *f;

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

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

4

4 回答 4

11

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

  • NULL在执行 a 之后fclose手动将文件指针设置FILE **
  • 无论您是否关闭它,都不要陷入“忘记”的情况(可能会很棘手)
于 2011-12-09T04:29:18.047 回答
8

彼得·诺维格引用奥古斯特·孔德(Auguste Comte,1798-1857)的话:

  "Nothing is destroyed until it is replaced"

您可以使用宏:

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

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

  • FILE *指针在 之后为 NULL ,fclose所以它不能是 fclose'd两次。

  • 此版本fclose 接受 NULL 参数。许多常见的版本——fclose例如 HPUX、SGI 和 CYGWIN 中的版本——都对 NULL 感到满意。奇怪的是,受 FreeBSD 启发的版本(如 Linux 和 Microsoft)不是。

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

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

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

于 2011-12-09T07:37:09.373 回答
3

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

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

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

仍然 a 不会为 NULL

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

free(a);
a=NULL;

编辑:您无法随时检查其是否已关闭/已释放。只是为了确保您可以在 free/fclose 之后将其分配为 NULL,以便您可以检查它是否为 NULL 并继续..

于 2011-12-09T04:46:41.927 回答
0

是的,你可以这样做。更好的方法是设置fpNULL else

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

于 2011-12-09T06:30:50.253 回答