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

13

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

基本上,我想检查一个文件是否已经被关闭,然后再关闭文件。

例如如下:

FILE *f;

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

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

4个回答

11

由于参数是按值传递的,因此fclose不可能将您的文件指针设置为NULL。由于fclose可能会销毁FILE,所以您必须:

  • 在执行fclose后手动将文件指针设置为NULL(如果您在不同的函数中关闭它,则不起作用,除非您使用FILE **
  • 不要陷入“忘记”是否已关闭它的情况中(可能会有些棘手)

在这种情况下,我该如何找出文件是否已经关闭。 - CuriousCoder

8

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

  "Nothing is destroyed until it is replaced"

您可以使用宏:
```

您可以使用宏:

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

这个版本的fclose解决了两个不同而对立的问题:
  • FILE *指针在fclose后变为NULL,因此不能被再次fclose

  • 这个版本的fclose将接受一个NULL参数。许多常见的fclose版本——如HPUX、SGI和CYGWIN的版本——都支持NULL。很奇怪的是,类似于Linux和Microsoft中的FreeBSD版本不支持。

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

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

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


3

FILE *是一个指向FILE结构的指针,当你调用fclose()时,它将销毁/释放FILE结构,但不会更改FILE*指针的值,这意味着它仍然拥有该FILE结构的地址,但该结构现在不存在。

与使用malloc获取的任何指针发生的情况相同。

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

仍然不会是NULL

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

free(a);
a=NULL;

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


0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接