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