文件关闭后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
它将是悬空指针(一个指向它不拥有或不存在的东西的指针)