c - fscanf 和 fprintf 在 C 中缓冲吗?

标签 c io buffer scanf stdio

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

最佳答案

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

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

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

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

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

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

关于c - fscanf 和 fprintf 在 C 中缓冲吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36758045/

相关文章:

显示构建错误弹出窗口的代码块

c - 如何只包含来自不同 C 文件的一个函数

Java IO、输入流和输出流测试

ios - "IOSurface warning: buffer allocation failed"导致应用崩溃

c - c 中的素数和立方和

c - 即使使用正确,Pthreads 也会泄漏内存

java - 从二进制文件读取并将某些信息转换为字符串

haskell - 如何在 Haskell 中组合句柄?

java - 在 JavaFx 中使用 JTS 拓扑

将 int 复制到 Char 数组