繁体   English   中英

fscanf和fprintf是否在C中缓冲?

[英]Are fscanf and fprintf buffered in C?

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

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

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

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

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

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

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

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

标准I / O库提供了一个简单而有效的缓冲流I / O接口。 输入和输出被映射到逻辑数据流,并且物理I / O特性被隐藏。 函数和宏在下面列出; 有关更多信息,请参见各个手册页。

如果要避免缓冲,则必须使用其他C库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM