【发布时间】:2010-09-15 19:47:57
【问题描述】:
对于 FILE* 流,如果我尽可能多地读取数据,则 feof(stream) 返回非零。那么,如果我关闭流,它 feof(stream) 会继续返回非零值吗? 有保证吗?
【问题讨论】:
对于 FILE* 流,如果我尽可能多地读取数据,则 feof(stream) 返回非零。那么,如果我关闭流,它 feof(stream) 会继续返回非零值吗? 有保证吗?
【问题讨论】:
根据库的实现,调用 fclose() 将导致 FILE 结构中的资源重新分配,随后的尝试很可能会导致崩溃。我相信对此的标准术语是“未定义的行为”。
【讨论】:
并非适用于 feof() 的每个实现。
事实上,您甚至无法保证在您调用 fclose 后任何 f* 调用都能正常工作。
【讨论】:
在关闭的文件上调用 feof() 是没有意义的(实际上比无意义更糟糕 - 它是未定义的,所以任何事情都可能发生)。
来自 C 标准:
指向 FILE 的指针的值 之后的对象是不确定的 相关文件已关闭(包括 标准文本流)。
和
成功调用 fclose 函数导致指向的流 按要刷新的流和 要关闭的关联文件。任何 流的未写入缓冲数据 交付到宿主环境 写入文件;任何未读 缓冲的数据被丢弃。无论 调用是否成功,流 与文件和任何 由 setbuf 或 setvbuf 设置的缓冲区 功能与 流(如果是,则释放 自动分配)。
【讨论】:
不要这样做。不要尝试在已关闭的文件上运行 feof()。结果未定义。跟踪哪些文件句柄以其他方式关闭,而不是假设 EOF 将在它们上发出信号。
一般来说,在编写可移植代码时必须避免 C 中未定义的行为...它可能在您的平台上做一些明智的事情,但在另一个平台上可能会做一些完全荒谬或意想不到的事情。
Usenet 组comp.lang.c 上的人们几年前提出了一台假设计算机DeathStation 9000,它在未定义构造的情况下表现出最可怕的不良行为。这是一种教学工具,可让您远离依赖 C 中未定义的行为 :-)
【讨论】: