64,654
社区成员
发帖
与我相关
我的任务
分享
typedef long FILEPOS
typedef unsigned char _byte
FILEPOS CSimilarCore::KMP(FILE * src, vector<_byte>& str, vector<FILEPOS>& next)
{
FILEPOS mode_pos = 0;
bool forRead = true;
_byte ch;
while (!feof(src) && mode_pos < str.size()) {
//读取标识,避免文件指针回溯
if (forRead) {
fread(&ch, 1, 1, src);
}else {
forRead = true;
}
if (ch != str.at(mode_pos)) {
if (mode_pos == 0) {
//第一项失配
continue;
}else{
//根据跳转表控制指针
mode_pos = next.at(mode_pos - 1) + 1;
//fseek(src, -1, SEEK_CUR);
forRead = false;
}
}else{
//匹配成功,指针后移
mode_pos++;
}
}
if (mode_pos < str.size()) {
return -1;
}else{
FILEPOS res = ftell(src) - mode_pos;
//回溯文件指针,为下一次搜索准备
fseek(src, -1 - next.at(mode_pos - 1), SEEK_CUR);
return res;
}
}