C将部分文件读入缓存

C将部分文件读入缓存,c,file,file-io,cache-control,C,File,File Io,Cache Control,我必须做一个程序(Linux版),其中有一个非常大的索引文件,我必须搜索和解释文件中的数据。现在的问题是,我只允许在任何时候缓存文件的x字节(由参数确定),因此如果不是我要查找的数据,我必须从缓存中删除某些数据 如果我的理解是正确的,fopen(r)不会在缓存中放入任何内容,只有在调用getc或fread(指定大小)时才会缓存它 所以我的问题是,假设我使用fread并读取100个字节,但在检查它之后,100个字节中只有20个包含我需要的数据;如何从缓存中删除无用的80字节(或覆盖它),以便从文件

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

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

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


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

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

fread
的第一个参数是指向内存块的指针。因此,实现这一点的方法是将指针设置为要重写的内容。例如,假设您希望保留字节20-40并覆盖其他所有内容。您可以a)从长度为20开始调用
fread
,然后在大小为60的
buffer[40]
上再次调用它。或者b)您可以先进行碎片整理(即复制要保留在起始位置的字节),然后使用指向下一节的指针调用
fread

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


您应该考虑使用Open/Read(而不是fOpen/FADAD),如果您必须对缓冲进行精确控制。

< P>以FPEN()打开一个文件的读缓冲区,可以使用FFLUHSH()。还请注意,您可以使用setvbuf()控制缓冲区大小


你应该考虑使用Open/Read(而不是fOpen/FRAD),但是如果你必须对缓冲进行精确的控制。

< P>你为什么要对缓存进行微管理?第二,是什么让你认为你可以?在程序的命令行上指定的任何参数都不能控制缓存管理器的内部操作—它可能决定将整个文件读取到RAM中,也可能决定不读取任何文件,或者决定抛出一个参与方。您对它的任何控制都将使用低级API/syscalls,而且不会非常精细。

为什么要微观管理缓存?第二,是什么让你认为你可以?在程序的命令行上指定的任何参数都不能控制缓存管理器的内部操作—它可能决定将整个文件读取到RAM中,也可能决定不读取任何文件,或者决定抛出一个参与方。您对它的任何控制都将使用低级API/syscalls,而且不会非常精细。

我认为您可能会对需求感到困惑,或者可能是向您提供需求的人。您似乎指的是由操作系统管理的缓存,应用程序不必担心它。操作系统将确保它不会自动变大


“缓存”的另一个含义是您自己创建的,即
char*
缓冲区,或者您创建的任何在处理数据时临时保存数据的东西。只要不为缓冲区分配太多内存,您就可以很容易地管理这个缓冲区。

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


“缓存”的另一个含义是您自己创建的,即
char*
缓冲区,或者您创建的任何在处理数据时临时保存数据的东西。只需不为该缓冲区分配太多内存,您就可以轻松管理该缓冲区。

setvbuf用于C库完成的流缓冲。类似地,fflush只在这些缓冲区上运行。它们与O/S实现的缓存无关。是的,但是标准C库总是进行缓冲(它的默认缓冲区大小为BUFSIZ)。如果他想控制缓冲区,那就是方法。他谈到了缓存,但我猜理论上他指的是由C标准库维护的缓冲区…setvbuf是由C库完成的流缓冲。类似地,fflush只在这些缓冲区上运行。它们与O/S实现的缓存无关。是的,但是标准C库总是进行缓冲(它的默认缓冲区大小为BUFSIZ)。如果他想控制缓冲区,那就是方法。他谈到了缓存,但我想理论上可能他指的是由C标准库维护的缓冲区……这是我的教授对作业的要求之一。我认为这是愚蠢的,因为我认为缓存的全部目的是不注意它,只要你可以预测地通过内存,你需要回到你的教授那里,问他在这种情况下“缓存”到底是什么意思。坦白说,如果他想让你对O/S缓存进行微管理,他就是个白痴。你可以随意告诉他我是这么说的。在更仔细地阅读了说明之后,是加载到内存中的数据约束了我,他只是把它称为cac