【发布时间】:2012-01-16 11:36:49
【问题描述】:
我想知道文件关闭后 FILE 指针会发生什么。会是NULL吗?
基本上,我想在关闭文件之前检查文件是否已经关闭。
例如如下:
FILE *f;
if(f!=NULL)
{
fclose(f);
}
我可以这样做还是有其他方法可以解决?
【问题讨论】:
我想知道文件关闭后 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)
这解决了两个不同且相反的问题:
FILE * 指针在fclose 之后为 NULL,因此不能
fclose'd 两次。
此版本的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);
仍然 a 不会为 NULL
在大多数情况下,我总是这样做
free(a);
a=NULL;
编辑:您无法随时检查其是否已关闭/释放。只是为了确保您可以在 free/fclose 之后将其分配为 NULL,以便您可以检查其是否为 NULL 并继续..
【讨论】:
是的,您可以这样做。更好的方法是将fp 设置为NULL
否则
它将是悬空指针(指向它不拥有或不存在的东西的指针)
【讨论】: