在缓冲区

时间:2016-01-21 14:08:38

标签: c++ full-text-search buffer

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

所以我有一个巨大的文件,并将其读取到小缓冲区并扫描它为“针”字:

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

但是,如果“干草”中的“针”将被块边界切割怎么办?它是不可能找到的。

我看到的一个解决方案是每次读取下一个块fseek(减少“针”字符串长度的偏移量)

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

我是对的吗?

1 个答案:

答案 0 :(得分:1)

你是对的,你需要处理搜索模式跨越两个街区的情况。

你也可以寻求解决方案。

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

解决方案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)个字符(或确保它们与您的模式不匹配,例如通过初始化)。后续搜索应搜索整个缓冲区。