我想知道文件关闭后 FILE 指针会发生什么。它会是NULL吗?
基本上,我想在关闭文件之前检查文件是否已经关闭。
例如如下:
FILE *f;
if(f!=NULL)
{
fclose(f);
}
我可以这样做还是有其他方法可以解决?
由于参数是按值传递的,因此无法fclose
将文件指针设置为NULL
. 因为fclose
可能会破坏FILE
你必须
NULL
在执行 a 之后fclose
手动将文件指针设置FILE **
为彼得·诺维格引用奥古斯特·孔德(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
,以遵循约定。
FILE * 它是一个指向 FILE 结构的指针,当您调用 fclose() 时,它将破坏/释放 FILE 结构,但不会更改 FILE* 指针的值,这意味着它仍然具有该 FILE 结构的地址,该地址现在不退出。
使用 malloc 获得的任何指针都会发生同样的事情
int a malloc(10);
free(a);
仍然 a 不会为 NULL
在大多数情况下,我总是做这些事情
free(a);
a=NULL;
编辑:您无法随时检查其是否已关闭/已释放。只是为了确保您可以在 free/fclose 之后将其分配为 NULL,以便您可以检查它是否为 NULL 并继续..
是的,你可以这样做。更好的方法是设置fp
为NULL
else
它将是悬空指针(指向它不拥有或不存在的东西的指针)