C 将文件的一部分读入缓存



我必须做一个程序(对于Linux),其中有一个非常大的索引文件,我必须搜索和解释文件中的数据。现在的问题是,我只允许在任何时候缓存文件的 x 字节(由参数确定),因此如果不是我想要的,我必须从缓存中删除某些数据。

如果我的理解是正确的,fopen (r) 不会在缓存中放置任何东西,只有当我调用 getc 或 fread(指定大小)时,它才会被缓存。

所以我的问题是,假设我使用 fread 并读取 100 个字节,但在检查后,100 个字节中只有 20 个包含我需要的数据; 我将如何从缓存中删除无用的 80 字节(或覆盖它)以便从文件中读取更多。

编辑 通过缓存,我的意思是存储在内存中的数据,这使问题更容易

fread的第一个参数是指向内存块的指针。因此,解决此问题的方法是将指针设置为要覆盖的内容。例如,假设您要保留字节 20-40 并覆盖其他所有内容。您可以 a) 在开始时以 20 的长度调用 fread,然后在大小为 60 的buffer[40]上再次调用它。或 b) 您可以从碎片整理开始(即将要保留的字节复制到开头),然后使用指向下一部分的指针调用fread

为什么要

对缓存进行微观管理?其次,是什么让你认为你可以?在程序命令行上指定的任何参数都无法控制缓存管理器在内部执行的操作 - 它可能决定将整个文件读入 RAM,它可能决定不读取任何文件,或者它可能决定抛出派对。您对它的任何控制都将使用低级 API/系统调用,并且不会非常精细。

我想你可能会对要求感到困惑,或者可能是给你这些要求的人。 您似乎指的是由操作系统管理的缓存,应用程序无需担心。 操作系统将确保它不会自动增长太大。

"缓存"的另一个含义是您自己创建的缓冲区,char*缓冲区或您创建的任何内容,用于在处理数据时将数据临时保存在内存中。 这个应该很容易管理自己,只需不为该缓冲区分配太多内存即可。

要丢弃使用 fopen() 打开的文件的读取缓冲区,可以使用 fflush()。另请注意,您可以使用 setvbuf() 控制缓冲区大小。

但是,如果您

必须完全控制缓冲,则应考虑使用 open/read(而不是 fopen/fread)。

相关内容

  • 没有找到相关文章

最新更新