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。
printf
和 scanf
函数族都是同一个缓冲 "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 库。
我希望编写一个高效的 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。
printf
和 scanf
函数族都是同一个缓冲 "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 库。