【问题标题】:fclose function in c, Why fread() works but not fwrite() if you call fclose for file handlerc 中的 fclose 函数,如果您为文件处理程序调用 fclose,为什么 fread() 有效但 fwrite() 无效
【发布时间】:2013-09-28 09:27:13
【问题描述】:

如果我们使用 fread() 读取文件并且不包含 fclose 以关闭相同的文件引用但它仍然有效,为什么会这样。

但是,如果我们忘记在 fwrite 之后包含 fclose,那么它就不起作用了。即文件上没有写反映。

【问题讨论】:

    标签: c file-io concept


    【解决方案1】:

    fread(),顾名思义,从文件中读取数据。从逻辑上讲,它在实际读取数据(将其存储在您提供的缓冲区中)或报告错误之前无法返回。只要fread()返回,就可以使用数据了。

    另一方面,fwrite() 可以在 C 运行时库、操作系统和其他地方进行多层缓冲。 fwrite() 在处理您的数据并将其写入时返回...某处。在您刷新它 (fflush(outfile);) 或关闭它 (fclose(outfile);) 之前,无法保证它实际上已写入物理文件。只要fwrite() 返回,您就可以对传递给它的数据做您喜欢的事情(它已被复制),但这就是您可以假设的全部。

    如果您的程序正常终止,它将隐式关闭(并因此刷新)所有打开的输出文件。如果您的程序异常终止,这可能不会发生。

    (实际上,我认为在某些情况下,即使在fclose()fflush() 之后,数据也可能不会物理到达文件中。)

    【讨论】:

      【解决方案2】:

      文件访问被缓冲。当你执行fread()时,在读取实际数据之前它不能返回,但是如果你执行fwrite(),那么它可以在将写入的数据放入文件缓冲区之后但在将其写入基础文件之前返回.

      fclose() 的副作用是刷新文件缓冲区 - 您也可以在 fwrite() 之后使用 fflush() 来达到相同的效果。

      【讨论】:

        【解决方案3】:

        因为读取操作显然必须在fread 函数返回后完成 - 实际读取缓冲区中的数据是fread 的后置条件之一,否则您无法确定是否可以使用调用fread1后缓冲区中的数据。

        fwrite 相反,可以(并且将会)进行写缓冲——它会在其私有缓冲区中积累数据,然后再将其传递给操作系统以实际将其写入文件中;这是可能的(也很方便),因为就您的程序而言,这件事是完全透明的:数据已经存储在其他缓冲区中,如果您从同一个流中读回,您会在那里找到您的数据,并且您仍然可以从缓存中获得性能改进。不过,如果您需要将数据立即发送到操作系统,您可以使用fflush

        顺便说一句,即使您不立即调用fclose,标准也保证在正常程序终止的情况下,流会自动关闭,因此它们的内容会被刷新。


        1. 顺便说一下,在某些情况下,仅当数据可用时才获取数据或开始读取操作并稍后检查数据是否已实际读取是有用的 - 这就是操作系统提供非阻塞和异步 IO 功能的原因。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-25
          • 1970-01-01
          • 2021-11-25
          • 2011-12-31
          • 2015-12-04
          • 2014-12-02
          • 2010-10-26
          • 1970-01-01
          相关资源
          最近更新 更多