2017-08-26 10 views
2

下面是IBM报价(在C99标准还规定)为什么在fopen()创建的文件流的输入和输出操作之间需要fflush()?

当您打开一个文件进行更新,可以对所得到的数据流进行输入和输出 操作。但是,输出操作 不能在没有插入fflush子例程调用或文件定位操作 (fseek,fseeko,fseeko64,fsetpos,fsetpos64或倒带子例程)的情况下不进行输入操作。 此外,除非输入操作遇到文件末尾,否则输入操作不能直接跟随输出 操作而没有介入的刷新或文件定位操作, 。

为什么这是必要的?

+0

[MSDN says](https://msdn.microsoft.com/en-us/library/yeby3zcb.aspx)当指定“r +”,“w +”或“a +”访问类型时,读取和写入被启用(该文件被称为“更新”)。但是,从阅读切换到书写时,输入操作必须遇到EOF标记。如果没有EOF,则必须使用中间调用文件定位功能。文件定位函数是'fsetpos','fseek'和'rewind'。从写入切换到读取时,必须使用中间调用来调用fflush或文件定位功能。 –

+0

请注意,上述内容在从阅读切换到书写时不推荐'fflush'(与IBM描述相反)。尽管MSVC实现了输入缓冲区刷新,这是实现定义的。 –

回答

0

这些操作可能会被缓冲以避免将每个单独的字节单独写入磁盘。在开始阅读之前,我们必须确保所有先前的写入实际上存储在磁盘上。

另外,无论如何都需要寻找找到你想要阅读的东西。所以在实践中不是问题。

0

以允许输入和输出操作自由混合的方式编写标准流功能是可行的。的C标准不强加这样的限制对库作者主要有两个原因:

  • 限制方向改变某些操作允许一些最佳化,减少的测试次数为基本输入/输出功能,例如getc()putc(),它们通常被实现为简单的宏。

  • 历史实现充分利用了上述优点,并且对于如何以及何时允许改变方向已经存在限制。 C标准委员会只是将这些限制正式化,以允许现有代码符合要求。

C库的较新版本时必须锁定所有输入/输出操作流,所以对于一个方向改变的额外的测试将有微不足道的成本,但C标准是不太可能解除限制。

相关问题