首页 > 解决方案 > C 中的缓冲和文件 I/O

问题描述

许多年前,我注意到BlockRead()在 Delphi 7 中读取大型二进制文件时,与每次读取 16384 字节的块相比,逐字节读取文件的速度要低得多。这显然意味着 Delphi 7 没有使用内部缓冲区(至少,默认情况下)并且每次都BlockRead()直接从磁盘读取。

fread()在 C 中呢?开发人员应该自己/他自己管理缓冲,还是 C 库会处理它?我知道文本文件 I/O 默认情况下在 C 中缓冲,据我所知,可以更改内部缓冲区的大小。

更新:我认为 Delphi 7 可能确实为打开的文件使用了内部缓冲区,但它的默认大小很小。

标签: cdelphifile-io

解决方案


根据T. Crawford 和 P. Prinz所著的C: In a Nutshell (2005) 一书

当您通过调用打开一个普通文件时fopen( ),新的流被完全缓冲。... 打开文件后,在对其执行第一次输入或输出操作之前,您可以使用setbuf( )orsetvbuf( )函数更改缓冲模式。

似乎这通常与文件有关,而不仅仅是文本文件。

我将很快用一些测试的结果更新这个答案。


推荐阅读