FILE *fp=_tfopen(szXmlFilePath,L"rb"); if (fp==NULL) return; fseek(fp,0,SEEK_END); UINT nLen=ftell(fp); fseek(fp,0,SEEK_SET); // 宽字符类型 wchar_t* pStr_Read = new wchar_t[nLen/2+1]; // 分配空间 memset(pStr_Read,0,sizeof(wchar_t)*(nLen/2+1)); // 清空 fread(pStr_Read,1,nLen,fp); fclose(fp);
pStr_Read保存的是字符串,要在这个字符串中判断 是否包含子字符串subStr
方法一:转换为CSting 使用CString::Find()
CString subStr=L"你好"; CString xmlData=pStr_Read; delete []pStr_Read; // 释放空间 if (xmlData.Find(subStr)!=-1) { //... }
方法二:使用字符串搜索函数_tcsstr()
CString subStr=L"你好"; if (_tcsstr(pStr_Read,subStr)) { //... }
方法三: 使用KMP匹配算法
int next[20] ={0}; void Next(wchar_t* p,int *next) { int len=_tcslen(p); int j,k; next[0]=-1; j=0; k=-1; while(j<len-1) { if(k==-1||p[j]==p[k]) //匹配的情况下,p[j]==p[k] { j++; k++; next[j]=k; } else //p[j]!=p[k] k=next[k]; } } //des是目标串,pat是模式串,len1和len2是串的长度 int kmp(wchar_t des[],int len1,wchar_t pat[],int len2) { int p=0,s=0; while(p < len2 && s < len1) { if(pat[p] == des[s]) { p++;s++; } else { if(p==0) { s++;//若第一个字符就匹配失败,则从des的下一个字符开始 } else { p = next[p];//用失败函数确定pat应回溯到的字符 } } } if(p < len2)//整个过程匹配失败 { return -1; } return s-len2; }
CString subStr=L"你好"; if (kmp(pStr_Read,nLen/2,subStr,subStr.GetLength())) { //... }