2016-04-21 90 views
0

我希望编写一个高效的C程序,它会生成一个文件的副本。似乎没有执行此操作的功能(如rename)。我打算在stdio.h中使用fscanffprintf,但是他们的描述并没有说明如何或如何对它们进行缓冲。它们是否缓冲在不同的缓存级别之间? (我假设磁盘到内存缓冲区由操作系统处理)fscanf和fprintf缓存在C中吗?

回答

1

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

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

FILE对象上使用任何常规I/O函数都会利用缓冲。

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

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

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

0

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

标准I/O库提供了一个简单高效的缓冲 流I/O接口。输入和输出被映射为逻辑数据流 ,并且物理I/O特征被隐藏。下面列出了 函数和宏;更多的信息是 可从各个手册页获得。

如果你想避免缓冲,你将不得不使用不同的C库。