1.文字格式转码文件(DataInfo)
1.1 gbk_unicode.idx
1.2 gbk_utf.idx
2.lyParseUtil文件夹
2.1 lyParseUtil.c

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <time.h> #include "lyFileUtil.h" #include "../lyPublic.h" #include "../lySQL.h" #include "../lyString.h" int ExactSameMatchFunc(const char *szSource,const char *szFileSource,char szUserData[], int iDataSize, int *iSubPos); int ExactMatchFunc(const char *szSource,const char *szFileSource,int iType,char szUserData[], int iDataSize, int *iSubPos); int PartialMatchFunc(const char *szSource,const char *szFileSource,int iType,char szUserData[], int iDataSize, int *iSubPos); int InclusionMatchFunc(const char *szSource,const char *szFileSource,int iType,char szUserData[], int iDataSize, int *iSubPos); /* szSource表示输入内容 szUserData表示用户输出数据:完整的匹配项 iDataSize表示szUserData的大小, iMatchtype表示匹配类型:0-完全一致匹配 ; 1-精确匹配 ; 2-部分匹配 ; 3-包含匹配 iType表示匹配位置:0--从起始位置,1--从末尾匹配;2--从任意位置匹配 (Note:当iMatchtype值为4(包含匹配)时,iType:0--选择最先匹配;1--最短匹配;2--最长匹配) iFileType表示匹配项:0-国家,1-全球城市 iStartPos匹配的起始位置 iSubPos为字串匹配到的位置 若判断出来,返回字符长度 若未判断出来,返回0 (.*)((.*)) 分隔符为:|| */ int IsNeedDataInfo(const char *szSource,char szUserData[], int iDataSize,int iMatchtype,int iType,char * szFileName,int iStartPos, int *iSubPos) { int iSrLen = 0 ; char *szFileSource; //idx源文件 const char *szPos1; int iRetVal = 0; char szFileNameTemp[256]=""; //文件名 *iSubPos = 0; if(!szSource || (int)strlen(szSource) <= iStartPos){ //输入字符串或者起始位置越界 return -1; } memset(szUserData, 0, iDataSize); // if(strstr(szFileName,"DataInfo")) sprintf(szFileNameTemp,"%s",szFileName); // else // sprintf(szFileNameTemp,"%s%s",LY_DATA_PATH,szFileName); szFileSource = ReadFileData(szFileNameTemp); //读取文件 if(!szFileSource) return -1; szPos1 = szSource; iSrLen = strlen(szPos1); szPos1 += iStartPos; if(iMatchtype == 0){ //完全一致匹配 iRetVal = ExactSameMatchFunc(szPos1,szFileSource,szUserData,iDataSize, iSubPos); } else if(iMatchtype == 1){ //精确匹配 iRetVal = ExactMatchFunc(szPos1,szFileSource,iType,szUserData,iDataSize, iSubPos); } else if(iMatchtype == 2){ //部分匹配 iRetVal = PartialMatchFunc(szPos1,szFileSource,iType,szUserData,iDataSize, iSubPos); } else if(iMatchtype == 3){ iRetVal = InclusionMatchFunc(szPos1, szFileSource, iType, szUserData, iDataSize, iSubPos); } else iRetVal = 0; if (szFileSource) { free(szFileSource); szFileSource = NULL; } //添加匹配位置偏移量 if(*iSubPos > 0) *iSubPos += iStartPos; return iRetVal; } /* 函数功能:“完全一致匹配”字符串的关键字。 参数:szSource-:输入字符串。 iType:0--从起始位置,1--从末尾匹配;2--从任意位置匹配。 szFileSource:文件。 szUserData:用户输出数据 iDataSize:用户输出数据的长度 iSubPos:匹配到的位置 返回值:大于0--关键字的长度;-1--意外错误;0--找不到关键字 */ int ExactSameMatchFunc(const char *szSource,const char *szFileSource,char szUserData[], int iDataSize, int *iSubPos) { const char *szPos1,*szPos2; char szTemp[512]=""; int iSrLen; //输入字符串的长度 szPos1 = szSource; if(!szPos1) return -1; memset(szUserData, 0 , iDataSize ); *iSubPos = 0; memset(szTemp,0,sizeof(szTemp)); strcpy(szTemp,"||"); strcat(szTemp,szPos1); strcat(szTemp,"||"); szPos2 = strstr(szFileSource,szTemp); //在文件完全一致查找 if(szPos2){ iSrLen = strlen(szPos1); strcpy(szUserData,szPos1); return iSrLen; } return 0; } /* 函数功能:“精确匹配”字符串的关键字。 参数:szSource-:输入字符串。 iType:0--从起始位置,1--从末尾匹配;2--从任意位置匹配。 szFileSource:文件。 szUserData:用户输出数据 iDataSize:用户输出数据的长度 iSubPos:匹配到的位置 返回值:大于0--关键字的长度;-1--意外错误;0--找不到关键字 */ int ExactMatchFunc(const char *szSource,const char *szFileSource,int iType,char szUserData[], int iDataSize, int *iSubPos) { const char *szPos1,*szPos3; char szTempUnit[512]=""; char szTempKeyWord[510]=""; //城市 int iSrLen = 0 ; // 源字符串的长度 int iKeyWordLen = 0; // 城市的长度 int iRunLen = 0; //往后走的长度 int iLeftLen = 0; szPos1 = szSource; *iSubPos = 0; if(!szPos1) return -1; memset(szUserData, 0 , iDataSize ); iSrLen = strlen(szPos1); //输入字符的长度 if(iSrLen < 4 || iSrLen >=500) // 小于4返回-1 return -1; else{ //大于1个长度的时候 iRunLen = 1; while(1){ //新增:判断是否为汉字 if(IsChnSatPos(szPos1,iRunLen) > 0) iRunLen += 1; iLeftLen = iSrLen - iRunLen; memset(szTempUnit,0,sizeof(szTempUnit)); strcat(szTempUnit,"||"); memset(szTempKeyWord,0,sizeof(szTempKeyWord)); if(iType == 0 || iType == 2) //从头部开始匹配或者任意位置匹配 strncpy(szTempKeyWord,szPos1,iRunLen); else if(iType == 1) {//从尾部开始匹配 strncpy(szTempKeyWord, szPos1 + iSrLen - iRunLen , iRunLen ); //把尾部的长度切割给szTempKeyWord } strcat(szTempUnit,szTempKeyWord); strcat(szTempUnit,"||"); iKeyWordLen = strlen(szTempKeyWord); szPos3 = strstr(szFileSource,szTempUnit); //精确匹配--匹配格式:“|城市名|“ if(szPos3) { //获取匹配到的位置 if (iType == 1) //尾部 { *iSubPos = iSrLen - iKeyWordLen; } if (iType == 2) //任意位置 { *iSubPos = szPos1 - szSource; } strcpy(szUserData,szTempKeyWord); return iKeyWordLen; } if(iLeftLen < 0) return 0; if(iLeftLen == 0){ if(iType == 2){ if(IsChnSatPos(szPos1,1) > 0) szPos1 += 2; else szPos1 ++; //搜索起始位置不断下移1个长度 iSrLen = strlen(szPos1); if(iSrLen == 0) //如果搜索位置到达字符串末尾,则返回0,表示没有搜索到关键字 return 0; } else if(iType == 0 || iType == 1) return 0; iRunLen = 0; } iRunLen ++; } //while in } //else } /* 函数功能:“部分匹配”字符串的关键字。 参数:szSource-:输入字符串。 iType:0--从起始位置,1--从末尾匹配;2--从任意位置匹配。 szFileSource:文件。 szUserData:用户输出数据 iDataSize:用户输出数据的长度 iSubPos:匹配到的位置 返回值:大于0--关键字的长度;-1--意外错误;0--找不到关键字 */ int PartialMatchFunc(const char *szSource,const char *szFileSource,int iType,char szUserData[], int iDataSize, int *iSubPos) { const char *szPos1,*szPos3,*szPos4,*szPos5; char szTempKeyWord[510]=""; int iSrLen = 0 ; // 源字符串的长度 int iKeyWordLen = 0; // 关键字的长度 int iRunLen = 0; //往后走的长度 int iLeftLen = 0; int iTempLen = 0; *iSubPos = 0; szPos1 = szSource; iSrLen = strlen(szPos1); //输入字符的长度 memset(szUserData , 0 , iDataSize); if(iSrLen < 4 || iSrLen >=500) // 小于4返回-1 return -1; else{ //大于4个长度的时候 iRunLen = 1; while(1){ //新增:判断是否为汉字 if(IsChnSatPos(szPos1,iRunLen) > 0) iRunLen += 1; iLeftLen = iSrLen - iRunLen; memset(szTempKeyWord,0,sizeof(szTempKeyWord)); if(iType == 0 || iType == 2) //从头部开始匹配或者任意位置匹配 strncpy(szTempKeyWord,szPos1,iRunLen); else if(iType == 1) {//从尾部开始匹配 strncpy(szTempKeyWord, szPos1 + iSrLen - iRunLen , iRunLen ); //把尾部的长度切割给szTempKeyWord } iKeyWordLen = strlen(szTempKeyWord); if( IsChnSatPos(szTempKeyWord, 1 ) >0 && (iKeyWordLen % 2 == 0) ){ szPos3 = strstr(szFileSource,szTempKeyWord); //部分匹配--匹配格式:“关键字“ if(szPos3){ szPos4 = strstr(szPos3,"||"); while(1){ szPos3 --; szPos5 = strstr(szPos3,"||"); if(szPos5){ iTempLen = szPos4 - szPos5 - 1; if(iTempLen>0){ memset(szUserData, 0, iDataSize); strncpy(szUserData,szPos5 + 2,iTempLen - 1); break; } } } //获取匹配到的位置 if (iType == 1) //尾部 { *iSubPos = iSrLen - iKeyWordLen; } if (iType == 2) //任意位置 { *iSubPos = szPos1 - szSource; } return iKeyWordLen; } } if(iLeftLen == 0){ if(iType == 2){ if(szPos1 - szSource == iSrLen) //如果搜索位置到达字符串末尾,则返回0,表示没有搜索到关键字 return 0; //szPos1 ++; //搜索起始位置不断下移1个长度 if(IsChnSatPos(szPos1,1) > 0) szPos1 += 2; else szPos1 ++; //搜索起始位置不断下移1个长度 iSrLen = strlen(szPos1); } else if(iType == 0 || iType == 1) return 0; iRunLen = 3; while(iRunLen >= iSrLen) iRunLen --; } iRunLen ++; } //while in } //else } /** 函数功能: 匹配输入字符串中是否包含匹配数据 参数:szSource-:输入字符串。 iType:0--选择最先匹配;1--最短匹配;2--最长匹配 szFileSource:文件。 szUserData:用户输出数据 iDataSize:用户输出数据的长度 iSubPos:匹配到的位置 返回值:大于0--关键字的长度;-1--意外错误;0--找不到关键字 **/ int InclusionMatchFunc(const char *szSource,const char *szFileSource,int iType,char szUserData[], int iDataSize, int *iSubPos) { const char *szPos1,*szPos2, *szPos3; char szTempKeyWord[510]=""; char szTempMatchBuff[510] = ""; int iSrLen = 0 ; // 源字符串的长度 int iKeyWordLen = 0; // 关键字的长度 int iTempLen = 0; *iSubPos = 0; if(!szSource || !szFileSource) return -1; szPos1 = szFileSource; iSrLen = strlen(szSource); //输入字符的长度 memset(szUserData , 0 ,sizeof(szUserData)); if(iSrLen < 4 || iSrLen >=500) // 小于4返回-1 return -1; //判断匹配 while (szPos1) { szPos2 = strstr(szPos1, "||"); if (!szPos2) { memset(szTempKeyWord, 0, sizeof(szTempKeyWord)); strcpy(szTempKeyWord, szPos1); szPos1 = szPos2; } else { iTempLen = szPos2 - szPos1; memset(szTempKeyWord, 0, sizeof(szTempKeyWord)); strncpy(szTempKeyWord, szPos1, iTempLen); szPos1 = szPos2 + 2; } if (strlen(szTempKeyWord) > 0) { szPos3 = strstr(szSource, szTempKeyWord); if (szPos3) { if(strlen(szTempMatchBuff) == 0) { strcpy(szTempMatchBuff, szTempKeyWord); *iSubPos = szPos3 - szSource; } //最短匹配 if (iType == 1) { if (strlen(szTempMatchBuff) > strlen(szTempKeyWord)) { strcpy(szTempMatchBuff, szTempKeyWord); *iSubPos = szPos3 - szSource; } } //最长匹配 else if (iType == 2) { if (strlen(szTempMatchBuff) < strlen(szTempKeyWord)) { memset(szTempMatchBuff, 0, sizeof(szTempMatchBuff)); strcpy(szTempMatchBuff, szTempKeyWord); *iSubPos = szPos3 - szSource; } } //默认匹配 else break; } } } //找到匹配 iKeyWordLen = strlen(szTempMatchBuff); if (iKeyWordLen > 0) { strcpy(szUserData, szTempMatchBuff); return iKeyWordLen; } return 0; } /**** 功能:查找是否包含匹配的字串,并提取其关键词 szSource:输入字符串 szDest:匹配到的字串所在类别的关键字 iDestSize:szDest大小 szFileName:匹配数据存放文件 格式:[关键词1:字串1|字串2|字串3…][关键词2:字串1|字串2|字串3…]…… iSubPos:匹配到的位置 返回值:匹配字串的长度 **/ int GetSubStrFromFile(char *szSource, char *szDest, int iDestSize, char *szFileName, int *iSubPos) { char szFileNameTemp[256] = ""; char szTemp1[64] = ""; char szTemp2[512] = ""; char *szFileInfo, *szPos, *szPos1, *szPos2; int iLen, iTemp, iTempPos; if(!szSource || !szFileName) return 0; memset(szDest, 0, iDestSize); *iSubPos = 0; if(strstr(szFileName,"DataInfo")) sprintf(szFileNameTemp,"%s",szFileName); else sprintf(szFileNameTemp,"%s%s",LY_DATA_PATH,szFileName); szFileInfo = ReadFileData(szFileNameTemp); if(!szFileInfo) return 0; szPos = szFileInfo; while (1) { szPos1 = strstr(szPos, "["); if(!szPos1) break; szPos2 = strstr(szPos1 + 1, "]"); if(!szPos2) break; iLen = szPos2 - szPos1 - 1; if(iLen < 0) break; szPos = szPos2 + 1; memset(szTemp1, 0, sizeof(szTemp1)); memset(szTemp2, 0, sizeof(szTemp2)); strncpy(szTemp2, szPos1 + 1, iLen); iTemp = GetSubStrPosAndLen(szTemp2, ":", 2, &iTempPos); if (iTemp > 0) { strncpy(szTemp1, szTemp2, iTempPos); strcpy(szTemp2, szTemp2 + iTempPos + iTemp); } iTemp = GetSubStrPosAndLen(szSource, szTemp2, 2, &iTempPos); if (iTemp > 0) { strcpy(szDest, szTemp1); *iSubPos = iTempPos; free(szFileInfo); return iTemp; } } free(szFileInfo); return 0; } //根据键值获取数据 //返回值:数据,0-包含获取 int GetValueByKey(char *szSource, char *szFile, int iType,char *szDest, int iDestSize) { const char *szPos1=NULL,*szPos2=NULL; char *szFileBuf; int iStrLen; char szFileName[256]=""; //读取国家+首都文件 sprintf(szFileName, "%s%s", LY_DATA_PATH,szFile); szFileBuf = ReadFileData(szFileName); if(!szFileBuf) return 0; //匹配数据 szPos1= strstr(szFileBuf,szSource); if(!szPos1) { free(szFileBuf); return 0; } szPos1=strstr(szPos1,":"); szPos2=strstr(szPos1+1,"|"); iStrLen=szPos2-szPos1-1; szPos1=szPos1+1; memset(szDest,0,iDestSize); strncat(szDest,szPos1,iStrLen); free(szFileBuf); return 1; } /* 函数功能:“精确匹配”字符串的关键字。 参数:szSource-:输入字符串。 iType: 1--从前往后匹配(三星,先匹配三,再匹配三星),2--从后往前匹配(三星 先匹配三星,再匹配三) szFileSource:文件。 szUserData:用户输出数据 iDataSize:用户输出数据的长度 数据存储格式为:szStartFlag关键字szEndFlag 返回值:大于0--关键字的位置;-1--意外错误;0--找不到关键字 */ int GetSubStrPosByMatchFunc(const char *szSource,const char *szFileSource, char *szStartFlag, char *szEndFlag, char szUserData[], int iDataSize,int iType) { const char *szPos1 = NULL, *szPos2 = NULL, *szPos3 = NULL; char szTempUnit[512]=""; char szTempKeyWord[512]=""; //城市 char szRetKeyTemp[256] = ""; int iSrLen = 0 ; // 源字符串的长度 int iKeyWordLen = 0; // 城市的长度 int iRunLen = 0; //往后走的长度 int iLeftLen = 0; int iSubPos = 0; int iUserDataLen = 0; int iSubPos1 = 0; szPos1 = szSource; if(!szPos1) return -1; memset(szUserData, 0 , iDataSize ); iSrLen = strlen(szPos1); //输入字符的长度 if(iSrLen < 4 || iSrLen >=500) // 小于4返回-1 return -1; if (iType == 1) { //如果为1则从开始往全部去匹配 iRunLen = 1; } else { //其他则从全部往开始去匹配 iRunLen = iSrLen; } while(1) { //新增:判断是否为汉字 if(IsChnSatPos(szPos1,iRunLen) > 0) { if (iType == 1) { iRunLen += 1; iLeftLen = iSrLen - iRunLen; } else { iRunLen -= 1; iLeftLen = iRunLen; } } //iLeftLen为剩余的字数 iRunLen为去匹配的关键字长度 if(iLeftLen < 0) { return 0; } if (iRunLen <= 0) { return 0; } memset(szTempUnit,0,sizeof(szTempUnit)); if (szStartFlag) { strcat(szTempUnit, szStartFlag); } memset(szTempKeyWord, 0, sizeof(szTempKeyWord)); strncpy(szTempKeyWord, szPos1, iRunLen); strcat(szTempUnit,szTempKeyWord); if (szEndFlag) { strcat(szTempUnit, szEndFlag); } iKeyWordLen = strlen(szTempKeyWord); szPos3 = strstr(szFileSource,szTempUnit); //精确匹配--匹配格式:“||名称||“ if(szPos3) { //获取匹配到的位置 iSubPos = szPos3 - szFileSource; memset(szUserData , 0 ,iDataSize); strcpy(szUserData, szTempKeyWord); return iSubPos; } if (iType == 1) { iRunLen ++; } else { iRunLen --; } } return 0; } /**** 功能:从字符串的一个位置开始,到一个位置结束点中获取最后一个 关键字(改关键字被 szStartFlag开始,szEndFlag结束中包含的关键字) szSource:输入字符串 iStartPos:输入的字符串匹配起始位置 iEndPos:输入的字符串匹配的结束位置 szStartFlag:结果的起始标识符 szEndFlag:结果的结束标识符 szDest:匹配到的字串所在类别的关键字 iDestSize:szDest大小 iType 1为获取的结果为第一个 2为获取的结果为最后一个 格式:szStartFlag关键词1szEndFlag|字串1|字串2|字串3… szStartFlag关键词2szEndFlag|字串1|字串2|字串3… 返回值:匹配字串的长度 **/ int GetRetSubStrBySubFlag(const char *szSource, int iStartPos, int iEndPos, char *szStartFlag, char *szEndFlag, char *szDest, int iDestSize, int iType) { const char *szPos = NULL, *szPos1 = NULL, *szPos2 = NULL; int iKeyWordLen = 0; if(!szSource || strlen(szSource) < 1) return 0; memset(szDest, 0, iDestSize); //从字符串的起始位置开始循环判断 szPos = szSource + iStartPos; while (1) { //判断是否含有关键字的起始标识符 szPos1 = strstr(szPos , szStartFlag); //如果没有找到该起始标识符或者获取到标识符的位置超出了 要判断的字符串的结束位置 if (!szPos1 || (szPos1 - (szSource + iStartPos) > iEndPos)) { //如果结果szDest中有数据,则返回该数据的长度,否则则返回0 if (strlen(szDest) > 0) { return iKeyWordLen; } else { return 0; } } //从起始标识符后的数据判断是否包含有结束标识符 szPos1 += strlen(szStartFlag); szPos2 = strstr(szPos1 , szEndFlag); if (szPos2) { //如果包含则将此之间的数据赋值给szDest iKeyWordLen = szPos2 - szPos1; if(iKeyWordLen > iDestSize) return 0; memset(szDest , 0, iDestSize); strncpy(szDest, szPos1, iKeyWordLen); //如果iType为1,则返回匹配到的第一个结果,否则则继续匹配,直到最后一个结果 if (iType == 1) { return iKeyWordLen; } } //将要判断的字符串向后移 szPos = szPos1 + iKeyWordLen + strlen(szEndFlag) ; if (!szPos) { //如果后面没数据,则返回结果 if (strlen(szDest) > 0) { return iKeyWordLen; } else { return 0; } } } return 0; }
2.2 lyFileUtil.h

#ifndef _LYFILEUTIL_H_ #define _LYFILEUTIL_H_ #ifdef __cplusplus extern "C"{ #endif int IsNeedDataInfo(const char *szSource,char szUserData[], int iDataSize,int iMatchtype,int iType,char * szFileName,int iStartPos, int *iSubPos); int GetSubStrPosByMatchFunc(const char *szSource,const char *szFileSource, char *szStartFlag, char *szEndFlag, char *szUserData, int iDataSize,int iType); int GetRetSubStrBySubFlag(const char *szSource, int iStartPos, int iEndPos, char *szStartFlag, char *szEndFlag, char *szDest, int iDestSize, int iType); int GetValueByKey(char *szSource, char *szFile, int iType,char *szDest, int iDestSize); #ifdef __cplusplus } #endif #endif
2.3 lyIsAppDataFromFile.c

/************************************* 标题:lyParseFromFile.c 功能:所有通过文件来判断或者获取数据的函数都放在这个文件里面 说明: 包含所有通过文件来判断,通过文件获取所需要数据的函数 作者:孙永超 当前版本: 1.0 修改信息: 2013.03.27 **************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <time.h> #include "lyFileUtil.h" #include "../lyPublic.h" #include "../lyString.h" #include "../lyPublic/lySort.h" #include "lyIsAppDataFromFile.h" /* 该文件中包含所有通过文件来判断的函数 1 IsSinger 判断是否是歌手 2 IsSong 判断是否是歌曲 3 IsStoryName 判断是否是故事名称 4 IsEatMenu 判断是否是菜谱 5 IsWebSite 判断是否是网站 6 IsRestaurantName 判断是否餐厅名 7 IsPeopleNameFuzzy 模糊判断人名 8 IsPeopleName 精确判断人名 9 IsAndroidApp 判断是否android应用 10 IsGoods 判断是否是商品 11 IsPruduct_Phone 从头匹配是否为3C产品名称 12 If3cProduct 判断是否3C产品 13 IsFruit 判断是否是水果 14 IsToilet 判断是否是厕所 15 IsHotel 判断是否是酒店 16 IsEatAllRecipe 从所有文件判断是否是全菜谱 */ int ParseValuefromKey(char *szSource,char * key,char *result); //从头开始判断是否为歌手名称 //返回值:0——查找失败;大于0——歌手长度 int IsSinger(const char *szSource) { char szFileName[256]=""; int iRetVal=0; //得到歌手文件路径 sprintf(szFileName, "%ssinger.idx", LY_MUSIC_PATH); //利用折半方式查找 iRetVal = FuzzyMatchKeyWord(szSource, szFileName); return iRetVal; } //从头开始判断是否为歌曲名称 //返回值:0——查找失败;大于0——歌名长度 int IsSong(const char *szSource) { char szFileName[256]=""; int iRetVal=0; //得到歌手文件路径 sprintf(szFileName, "%ssong.idx", LY_MUSIC_PATH); //利用折半方式查找 iRetVal = FuzzyMatchKeyWord(szSource, szFileName); return iRetVal; } //判断某类别故事 int IsStoryName(char const *szSource, char *szDest, int iDestSize) { char szUnit[256] = ""; char szFileName[256]=""; char *szIdFile=NULL, *szPos = NULL, *szPos1 = NULL; int iLen=0; int iRetval=0; memset(szDest, 0, iDestSize); //打开身份证验证文件 sprintf(szFileName, "%sgushi_name.idx", LY_DATA_PATH); szIdFile = ReadFileData(szFileName); if(!szIdFile) return 0; //匹配是否存在 szPos = szIdFile; while (szPos && *szPos != '