fscanf 和 fprintf 是否在 C 中缓冲?

Are fscanf and fprintf buffered in C?

我希望编写一个高效的 C 程序,它可以创建一个文件的副本。似乎没有函数(例如stdio.h中的rename) that performs this. I plan to use fscanf an fprintf,但是他们的描述没有说明如何或是否缓冲它们。它们在不同的缓存级别之间缓冲吗?(我假设磁盘到内存缓冲区由 OS)

处理

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

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

FILE 对象上使用任何正常的 I/O 函数将利用缓冲。

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

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

最后,要获得最快的 I/O,您可能必须使用 OS 特定的 API。 C I/O 函数仅映射到那些 API 的一般情况,但可能存在无法通过 C 库控制的 OS 的特殊性能设置。在为 Windows 编写快速 AVI 编写器时,我当然 运行 喜欢这个。使用特定于平台的 I/O 我能够达到磁盘的最大 read/write 速度:缓冲速度的两倍 I/O (<stdio.h>) 或本机 AVI API,比传统的无缓冲 C 快 20% I/O。

printfscanf 函数族都是同一个缓冲 "interface" 的一部分。 man 3 stdio:

The standard I/O library provides a simple and efficient buffered stream I/O interface. Input and output is mapped into logical data streams and the physical I/O characteristics are concealed. The functions and macros are listed below; more information is available from the individual man pages.

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