fscanf和fprintf是否在C中缓冲?

时间:2016-04-21 01:33:15

标签: c io buffer scanf stdio

我希望编写一个高效的C程序,它可以复制一个文件。似乎不是一个执行此操作的函数(例如rename)。我打算在stdio.h中使用fscanffprintf,但是他们的描述没有说明它们是如何被缓冲的。它们是否在不同的缓存级别之间缓冲? (我假设磁盘到内存缓冲区由操作系统处理)

2 个答案:

答案 0 :(得分:1)

当您使用fopen打开文件时,它将完全缓冲。

您可以在使用setvbufreference)对文件执行任何其他操作之前更改缓冲。

使用FILE对象上的任何普通I / O函数都将利用缓冲。

如果您只是复制数据,那么您将进行顺序读取和写入,并且不一定需要缓冲。但有效地做到这一点需要为I / O操作选择合适的块大小。传统上,这与磁盘扇区的大小(4096字节)有关,但该值不是面向未来的。 fopen使用的默认值为BUFSIZ

与任何优化一样,构建实际测试以验证您的性能增益(或损失)。

最后,对于速度最快的I / O,您可能必须使用特定于操作系统的API。 C I / O函数只是映射到这些API的一般情况,但是可能存在无法通过C库控制的OS的特殊性能设置。在为Windows编写快速AVI编写器时,我当然遇到了这个问题。使用特定于平台的I / OI能够实现磁盘的最大读/写速度:缓冲I / O(<stdio.h>)或本机AVI API速度的两倍,比传统C快约20%无缓冲的I / O.

答案 1 :(得分:0)

printfscanf系列函数都是同一缓冲“接口”的一部分。 man 3 stdio

  

标准I / O库提供简单而有效的缓冲   流I / O接口。输入和输出映射到逻辑数据   流和物理I / O特性被隐藏。该   功能和宏列在下面;更多信息是   可从个人手册页获得。

如果您想避免缓冲,则必须使用不同的C库。