我必须做一个程序(对于Linux),其中有一个非常大的索引文件,我必须搜索和解释文件中的数据。现在的问题是,我只允许在任何时候缓存文件的x字节(由参数确定)所以如果它不是我正在寻找的话,我必须从缓存中删除某些数据。
如果我的理解是正确的,fopen(r)不会在缓存中放任何东西,只有当我调用getc或fread(指定大小)时才会缓存它。
所以我的问题是,假设我使用fread并读取100个字节,但在检查之后,100个字节中只有20个包含我需要的数据;如何从缓存中删除无用的80字节(或覆盖它),以便从文件中读取更多内容。
编辑通过缓存我的意思是存储在内存中的数据,这使问题更容易
答案 0 :(得分:2)
fread
的第一个参数是指向内存块的指针。所以解决这个问题的方法是将指针设置为你想要写的东西。例如,假设您要保留字节20-40并覆盖其他所有内容。你可以a)在开始时调用fread
,长度为20,然后在buffer[40]
上再次调用它,大小为60.或b)你可以从碎片整理开始(即复制你想要的字节)保持开始)然后用指向下一部分的指针调用fread
。
答案 1 :(得分:2)
为什么要对缓存进行微观管理?其次,是什么让你认为你可以?在程序的命令行中没有指定参数可以控制缓存管理器在内部执行的操作 - 它可能决定将整个文件读入RAM,它可能决定不读取任何内容,或者它可能决定抛出一方。您对它的任何控制都将使用低级别的API /系统调用,并且不会非常精细。
答案 2 :(得分:1)
我认为您可能会对这些要求感到困惑,或者可能是将这些要求交给您的人。您似乎指的是操作系统管理的缓存,无需担心应用程序。操作系统将确保它不会自动变得过大。
"缓存"的另一个含义是您自己创建的那个,char*
缓冲区或您创建的任何内容,以便在处理数据时暂时将数据保存在内存中。仅仅通过不为该缓冲区分配太多内存就可以很容易地管理自己。
答案 3 :(得分:-1)
要丢弃使用fopen()打开的文件的读缓冲区,可以使用fflush()。另请注意,您可以使用setvbuf()控制缓冲区大小。
如果你必须对缓冲有精确的控制,你应该考虑使用open / read(而不是fopen / fread)。