[英]Are fscanf and fprintf buffered in C?
当您使用fopen
打开文件时,该文件将被完全缓冲。
您可以使用setvbuf
( reference )在对该文件执行任何其他操作之前更改缓冲。
在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。
printf
和scanf
系列功能都是同一缓冲“接口”的一部分。 man 3 stdio
:
标准I / O库提供了一个简单而有效的缓冲流I / O接口。 输入和输出被映射到逻辑数据流,并且物理I / O特性被隐藏。 函数和宏在下面列出; 有关更多信息,请参见各个手册页。
如果要避免缓冲,则必须使用其他C库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.