- 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);
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 xmlData=pStr_Read;
- delete []pStr_Read; // 释放空间
- if (xmlData.Find(subStr)!=-1)
- {
- //...
- }
CString subStr=L"你好";
CString xmlData=pStr_Read;
delete []pStr_Read; // 释放空间
if (xmlData.Find(subStr)!=-1)
{
//...
}
方法二:使用字符串搜索函数_tcsstr()
- CString subStr=L"你好";
- if (_tcsstr(pStr_Read,subStr))
- {
- //...
- }
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;
- }
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;
}
- if (kmp(pStr_Read,nLen/2,subStr,subStr.GetLength()))
- {
- //...
- }