我希望知道文件关闭后FILE指针会发生什么。它会是NULL吗?
基本上,我想在关闭文件之前检查文件是否已经关闭。
例如如下:
FILE *f;
if(f!=NULL)
{
fclose(f);
}
我可以这样做,还是有其他方法可以解决这个问题?
答案 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
其他
它将是悬空指针(一个指向它不拥有或不存在的东西的指针)