下面是IBM报价(在C99标准还规定)为什么在fopen()创建的文件流的输入和输出操作之间需要fflush()?
当您打开一个文件进行更新,可以对所得到的数据流进行输入和输出 操作。但是,输出操作 不能在没有插入fflush子例程调用或文件定位操作 (fseek,fseeko,fseeko64,fsetpos,fsetpos64或倒带子例程)的情况下不进行输入操作。 此外,除非输入操作遇到文件末尾,否则输入操作不能直接跟随输出 操作而没有介入的刷新或文件定位操作, 。
为什么这是必要的?
[MSDN says](https://msdn.microsoft.com/en-us/library/yeby3zcb.aspx)当指定“r +”,“w +”或“a +”访问类型时,读取和写入被启用(该文件被称为“更新”)。但是,从阅读切换到书写时,输入操作必须遇到EOF标记。如果没有EOF,则必须使用中间调用文件定位功能。文件定位函数是'fsetpos','fseek'和'rewind'。从写入切换到读取时,必须使用中间调用来调用fflush或文件定位功能。 –
请注意,上述内容在从阅读切换到书写时不推荐'fflush'(与IBM描述相反)。尽管MSVC实现了输入缓冲区刷新,这是实现定义的。 –