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

Cur*_*der 11 c file fclose

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

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

例如如下:

FILE *f;

if(f!=NULL)
{
  fclose(f);
}
Run Code Online (Sandbox Code Playgroud)

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

cni*_*tar 10

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

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


Jos*_*sey 7

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

  "Nothing is destroyed until it is replaced"
Run Code Online (Sandbox Code Playgroud)

你可以使用宏:

  #define fclose(fp)  ((fp) ? fclose(fp) : 0, (fp) = 0)
Run Code Online (Sandbox Code Playgroud)

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

  • FILE *指针后NULL'd fclose,所以它不可能是 fclose'd两次.

  • 此版本fclose 接受NULL参数.许多常见版本 - fclose例如HPUX,SGI和CYGWIN中的版本 - 对NULL感到满意.奇怪的是FreeBSD启发的版本,例如Linux和Microsoft,都没有.

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

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

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