【问题标题】:Buffering and file I/O in CC 中的缓冲和文件 I/O
【发布时间】:2020-07-20 13:11:49
【问题描述】:

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

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

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

【问题讨论】:

  • 有很多级别的缓冲:磁盘设备驱动程序缓冲区、文件系统缓存、库/fread 缓冲区以及现在您的程序缓冲区……您的程序最清楚哪些块是经常需要的;缓存计数命中并刷新未使用的块,并将通过启发式方法接近您的程序的知识。也许不用担心。
  • 您为什么不像使用 Delphi 那样简单地尝试一下?

标签: c delphi file-io


【解决方案1】:

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

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

这似乎是关于一般文件,而不仅仅是文本文件。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 2015-07-05
    • 1970-01-01
    • 2011-08-05
    • 2012-01-14
    • 1970-01-01
    • 2011-10-05
    相关资源
    最近更新 更多