在一个大的二进制文件中搜索,在缓冲区中加载块

search in a big binary file loading blocks in buffer

我想知道在大文件中按块搜索,加载到内存缓冲区的算法。

所以我有一个很大的文件,将把它读取到小缓冲区并扫描它以查找 "needle" 个单词:

while ( read = fread(buff, buff_size, 1, file) )
   if strstr(buff, needle) print "found!";

但是如果"hay"中的"needle"会被块边框截断呢?将无法找到。

我看到的一个解决方案是每次都读取下一个块 fseek'ing(减少 "needle" 字符串长度的偏移量)

 offset += read - strlen(needle);
 if (offset > 0) fseek(file, offset ,SEEK_SET);

我说得对吗?

您说得对,您需要处理搜索模式跨越两个块的情况。

你说的也对,寻求也是一种解决方法。

但是还有其他不使用搜索的解决方案。

解决方案 1

一个解决方案可能是复制缓冲区的最后一部分,即 strlen(needle) 到一个能够容纳 2 次 strlen(needle) 的小缓冲区。

然后在读取下一个块时,将新缓冲区的第一部分(再次strlen(needle))复制到小缓冲区,以便它与前一个缓冲区末尾的部分相连接。

终于可以在小缓冲区中搜索 niddle 了。

解决方案 2

一个解决方案可能是从文件读入 buffer + strlen(needle),即避免覆盖缓冲区的前 strlen(needle) 个字符。从文件中读取的字符数必须相应减少(即 buff_size - strlen(needle)

完成缓冲区后,将最后 strlen(needle) 个字符复制到缓冲区的开头,然后从文件中读取更多数据到 buffer + strlen(needle)

对于缓冲区中的第一次搜索,您必须跳过前 strlen(needle) 个字符(或确保它们不匹配您的模式,例如通过初始化)。后续搜索应搜索整个缓冲区。