📄 stringsearch2.cpp
字号:
#include "stdio.h"
#include "string.h"
#include "io.h"
void main(int argc ,char *arg[]){
unsigned short buffer;
unsigned int Hz[0x10000],filelength,handle,keyStrlen,searchLeft,searchRight;
FILE *fpInp,*fpKeywordInp,*fpResultout;
for (unsigned int i=0;i<0x10000;i++) {
Hz[i]=0;
}
fpInp=fopen("2000.txt","rb");
if (fpInp==NULL) {
printf("error in open file");
}
handle=_fileno(fpInp);
filelength=(_filelength(handle))/2;
fread(&buffer,sizeof(short),1,fpInp);
for (unsigned int j=0;j<filelength;j++) {
fread(&buffer,sizeof(short),1,fpInp);
Hz[buffer]++;
}
rewind(fpInp);
Hz[0]=0;
for(i=1;i<0x10000;i++){
Hz[i]=Hz[i]+Hz[i-1];
}
unsigned int *succ=new unsigned int[filelength];
for (i=0;i<filelength;i++) {
succ[i]=0;
}
fread(&buffer,sizeof(short),1,fpInp);
for (i=0,j=0;i<filelength+1;i++,j=j+2) {
fread(&buffer,sizeof(short),1,fpInp);
Hz[buffer]--;
succ[Hz[buffer]]=j;
}
fpKeywordInp=fopen("keyString.txt","rb");
keyStrlen=_filelength(_fileno(fpKeywordInp))/2;
unsigned short *keyword=new unsigned short[keyStrlen];
fread(&buffer,sizeof(short),1,fpKeywordInp);
for (i=0;i<keyStrlen;i++) {
fread(&buffer,sizeof(short),1,fpKeywordInp);
keyword[i]=buffer;
}
searchLeft=Hz[keyword[0]];
unsigned int *SearchResult=new unsigned int[Hz[keyword[0]+1]-Hz[keyword[0]]];
for (i=0;i<Hz[keyword[0]+1]-Hz[keyword[0]];i++) {
SearchResult[i]=succ[searchLeft];
searchLeft++;
}
for (i=0;i<keyStrlen-2;i++) {
searchLeft=0;
searchRight=Hz[keyword[1+i]];
while (searchRight<Hz[keyword[i+1]+1]&&searchLeft<Hz[keyword[0]+1]-Hz[keyword[0]]) {
if (SearchResult[searchLeft]==0xffffffff) {
searchLeft++;
continue;
}
int temp=succ[searchRight]-SearchResult[searchLeft];
if (temp>0) {
if (succ[searchRight]-SearchResult[searchLeft]==2*(i+1)) {
searchLeft++;
searchRight++;
}
else
searchRight++;
}
else{
SearchResult[searchLeft]=0xffffffff;
searchLeft++;
}
}
}
unsigned short flag=0xfeff;
fpResultout=fopen("searchresult.txt","wb");
if(fpResultout==NULL)
printf("error in open file");
fwrite(&flag,sizeof(short),1,fpResultout);
for (i=0;i<Hz[keyword[0]+1]-Hz[keyword[0]];i++) {
if (SearchResult[i]!=0xffffffff) {
unsigned int pos=SearchResult[i]-10;
for(j=0;j<keyStrlen+10;j++){
fseek(fpInp,pos,0);
fread(&buffer,sizeof(short),1,fpInp);
fwrite(&buffer,sizeof(short),1,fpResultout);
pos=pos+2;
}
fputwc(13,fpResultout);
fputwc(10,fpResultout);
}
else
continue;
}
fclose(fpKeywordInp);
fclose(fpInp);
fclose(fpResultout);
// delete []succ;
// delete []keyword;
// delete []SearchResult;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -