【问题标题】:What is the return value of feof() on a closed file?关闭文件上 feof() 的返回值是多少?
【发布时间】:2010-09-15 19:47:57
【问题描述】:

对于 FILE* 流,如果我尽可能多地读取数据,则 feof(stream) 返回非零。那么,如果我关闭流,它 feof(stream) 会继续返回非零值吗? 有保证吗?

【问题讨论】:

    标签: c file


    【解决方案1】:

    根据库的实现,调用 fclose() 将导致 FILE 结构中的资源重新分配,随后的尝试很可能会导致崩溃。我相信对此的标准术语是“未定义的行为”。

    【讨论】:

      【解决方案2】:

      并非适用于 feof() 的每个实现。

      事实上,您甚至无法保证在您调用 fclose 后任何 f* 调用都能正常工作。

      【讨论】:

        【解决方案3】:

        在关闭的文件上调用 feof() 是没有意义的(实际上比无意义更糟糕 - 它是未定义的,所以任何事情都可能发生)。

        来自 C 标准:

        指向 FILE 的指针的值 之后的对象是不确定的 相关文件已关闭(包括 标准文本流)。

        成功调用 fclose 函数导致指向的流 按要刷新的流和 要关闭的关联文件。任何 流的未写入缓冲数据 交付到宿主环境 写入文件;任何未读 缓冲的数据被丢弃。无论 调用是否成功,流 与文件和任何 由 setbuf 或 setvbuf 设置的缓冲区 功能与 流(如果是,则释放 自动分配)。

        【讨论】:

          【解决方案4】:

          不要这样做。不要尝试在已关闭的文件上运行 feof()。结果未定义。跟踪哪些文件句柄以其他方式关闭,而不是假设 EOF 将在它们上发出信号。

          一般来说,在编写可移植代码时必须避免 C 中未定义的行为...它可能在您的平台上做一些明智的事情,但在另一个平台上可能会做一些完全荒谬或意想不到的事情。

          Usenet 组comp.lang.c 上的人们几年前提出了一台假设计算机DeathStation 9000,它在未定义构造的情况下表现出最可怕的不良行为。这是一种教学工具,可让您远离依赖 C 中未定义的行为 :-)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-01-06
            • 2010-12-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多