对于FILE *流,如果我读取尽可能多的数据,feof(stream)会返回非零值。然后,如果我fclose流,它feof(流)将继续返回一个非零值? 是保证吗?
答案 0 :(得分:12)
在一个已关闭的文件上调用feof()是没有意义的(实际上比没有意义的更糟糕 - 它是未定义的,所以任何事情都可能发生)。
来自C标准:
指向FILE的指针的值 对象是不确定的 关联文件已关闭(包括 标准文本流)。
和
成功调用fclose 函数导致流指向 通过流来冲洗和 要关闭的关联文件。任何 流的未写入缓冲数据 被送到主机环境 写入文件;任何未读的 缓冲的数据被丢弃。是否 或者呼叫成功,流 与文件和任何文件脱离关联 缓冲区由setbuf或setvbuf设置 功能与...脱离关联 流(如果是,则解除分配) 自动分配)。
答案 1 :(得分:3)
根据库实现,调用fclose()将导致在FILE结构中释放资源,随后的尝试可能会导致崩溃。我认为这个标准术语是“未定义的行为”。
答案 2 :(得分:2)
不要这样做。不要尝试在已关闭的文件上运行feof()
。结果未定义。跟踪哪些文件句柄以其他方式关闭,而不是假设EOF将在它们上发出信号。
一般情况下,在编写可移植代码时必须必须避免C中的未定义行为......它可能会在您的平台上做一些合理的事情,但它可能会在另一个上做一些非常荒谬或意外的事情。
Usenet小组comp.lang.c
上的人们多年前出现了一台假想的计算机DeathStation 9000,它在未定义的构造中表现出最令人恐惧的坏行为。这是一种教学工具,可以让你远离C依赖于未定义的行为: - )
答案 3 :(得分:1)
不适用于feof()的每个实现。
事实上,您甚至不能保证在调用fclose后任何 f *调用都能正常工作。