首页
社区
课程
招聘
[求助]关于C++ CString 分割文本效率问题
发表于: 2018-9-29 20:17 3609

[求助]关于C++ CString 分割文本效率问题

2018-9-29 20:17
3609

先贴上代码  

///参数为  源文本  分割结果指针数组    数组个数   用作分割的字符串
void StringSplit(CString data, CString* datas, int datasCount, CString men)
{

 int i = 0;
 while (i<datasCount)
 {
  int EndIndex = data.Find(men);
  if (EndIndex == -1)
  {
   datas[i] = data;
   break;
  }
  datas[i] = data.Mid(0, EndIndex);
  data.Delete(0, EndIndex + men.GetLength());
  ++i;
 }
 
}


关于效率问题 这样的效率很慢  有没有 大神有快速分割字符串的方法


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 9941
活跃值: (2143)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
用自带的吧 Tokenize
2018-9-30 03:57
0
雪    币: 6553
活跃值: (4351)
能力值: ( LV10,RANK:163 )
在线值:
发帖
回帖
粉丝
3
boost自带,一行搞定。
2018-9-30 06:45
0
雪    币: 2058
活跃值: (1661)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
最后于 2018-9-30 09:03 被youxiaxy编辑 ,原因:
2018-9-30 09:02
0
雪    币: 4
活跃值: (531)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
yimingqpa boost自带,一行搞定。
有代码吗
2018-9-30 09:20
0
雪    币: 4
活跃值: (531)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
VCKFC 用自带的吧 Tokenize
有代码吗
2018-9-30 09:20
0
雪    币: 776
活跃值: (3425)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
7
CString自带Tokenize,用法看MSDN。
另外是什么原因让你觉得效率低呢?如果是文本量很大或者文本很长,你可以考虑优化一下,比如Delete可以不要,在Find的第二个参数加入起始index来控制,我觉得效率会高很多。甚至可以不要使用CString,使用字符串数组和strstr之类的库函数,避免大量构造CString类。
如果是低规模的,其实你的函数已经能用了。
2018-9-30 10:09
0
雪    币: 4
活跃值: (531)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
yeyeshun CString自带Tokenize,用法看MSDN。 另外是什么原因让你觉得效率低呢?如果是文本量很大或者文本很长,你可以考虑优化一下,比如Delete可以不要,在Find的第二个参数加入起始ind ...
当文本超过1MB的时候     我用C#的string.split函数   和这个函数来切割的时候  能感觉的 慢太多太多    更大一点的时候  光分割数据  就差不多  要耗费10多分钟
2018-9-30 13:52
0
雪    币: 776
活跃值: (3425)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
9
我遇到这种问题,一般是这样处理的:
假如文本是这样的:A|B|C|D|E,大写字母表示一个文本串,|表示分隔符。
我会使用strchr搜索|,并且把|替换为'\0',只回传A、B、C、D、E的起始指针。
这样处理效率很高。
2018-9-30 15:53
0
雪    币: 1787
活跃值: (340)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
strtok
2018-9-30 17:05
0
雪    币: 2058
活跃值: (1661)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11



int str_GetSubStrCount(char* psz,int buflen,char* szsplit)
{
int nCount =0;
int pszendlen=strlen(szsplit);
if(pszendlen==0) return 0;
char *psend=psz+buflen-pszendlen;
bool ext=false;
//先得到 分割数目
while(psz<psend)
{
ext=true;
for(int i=0;i<pszendlen;i++)
{
if(szsplit[i]!=psz[i])
{
ext=false;
break;
}
}
if(ext)nCount++;
psz = _tcsinc(psz); 
}
return nCount;
}
/*
破坏性分割文本(原文本,原文本长度,分割字符[,存放文本数组])
此函数具有破坏性,分割后原文本不可释放。最后一个参数如果为空。则只统计分割数量,不分割 。

*/
int str_SplitEx(char* szbuf,int buflen,char* szsplit,char*** pszarr)
{
char * psz=szbuf;//(char*)malloc(buflen+2);
char *psz_old=psz;
int nCount =0;
int pszendlen=strlen(szsplit);
char *psend=psz+buflen-pszendlen;
bool ext=false;
nCount=::str_GetSubStrCount(szbuf,buflen,szsplit)+1;
if(pszarr==NULL)//数组指针不存在,。放弃分割、
return nCount;
char** pszdst=*pszarr;
char *strbuf=psz_old;
psz=psz_old;
pszdst=(char**)malloc(nCount*sizeof(char*)+4);
int arridx=0;
//开始分割
while(psz<psend)
{
ext=true;
for(int i=0;i<pszendlen;i++)
{
if(szsplit[i]!=psz[i])
{
ext=false;
break;
}
}
if(ext)
{
memset(psz,0,pszendlen);
//cs.ElementAt(arridx++)=strbuf;
pszdst[arridx++]=strbuf;
psz+=pszendlen;
strbuf=psz;
}
else
{
psz = _tcsinc(psz); 
}
}
pszdst[arridx]=strbuf;
//free(psz_old);
return nCount;
}
/*
快速分割文本
原文本指针
长度
分割字符
数组引用
*/
int str_Split(char *szbuf,int buflen,char *szsplit,CStringArray& cs)
{
char * psz=(char*)malloc(buflen+2);
char *psz_old=psz;
memset(psz,0,buflen+2);
memcpy(psz,szbuf,buflen);
// psz[szbuf+1]='\0';
// psz[szbuf+2]='\0';

int nCount =0;
int pszendlen=strlen(szsplit);
char *psend=psz+buflen-pszendlen;
bool ext=false;
//先得到 分割数目
while(psz<psend)
{
ext=true;
for(int i=0;i<pszendlen;i++)
{
if(szsplit[i]!=psz[i])
{
ext=false;
break;
}
}
if(ext)nCount++;
psz = _tcsinc(psz); 
}
char *strbuf=psz_old;
psz=psz_old;
cs.SetSize(nCount+1);
int arridx=0;
//开始分割
while(psz<psend)
{
ext=true;
for(int i=0;i<pszendlen;i++)
{
if(szsplit[i]!=psz[i])
{
ext=false;
break;
}
}
if(ext)
{
//
memset(psz,0,pszendlen);
cs.ElementAt(arridx++)=strbuf;
psz+=pszendlen;
strbuf=psz;
}
else
{
psz = _tcsinc(psz); 
}
}
if(strlen(strbuf)>0)
{
cs.ElementAt(nCount)=strbuf;
nCount++;
}
else
{
cs.SetSize(nCount);
}
free(psz_old);
return nCount;
}



2018-9-30 17:49
0
雪    币: 6553
活跃值: (4351)
能力值: ( LV10,RANK:163 )
在线值:
发帖
回帖
粉丝
12
fstream rFile(wstrPath.c_str());

               if (rFile.is_open())
               {
                       string strLine;

#pragma omp parallel while
                       while (::getline(rFile, strLine))
                       {
                               vector<string> vetag;
                               boost::split(vetag, strLine, boost::is_any_of("#"));

                               if (4 == vetag.size())
                               {
                                       AccountInfo AInfo;
                                       AInfo.sAccount = CA2W(vetag.at(0).c_str());
                                       AInfo.sPassWord = CA2W(vetag.at(1).c_str());
                                       AInfo.sRegion = CA2W(vetag.at(2).c_str());
                                       AInfo.sServer = CA2W(vetag.at(3).c_str());

                                       pInfo->push_back(AInfo);
                               }
                       }

                       rFile.close();
                       bRet = true;
               }
2018-9-30 23:01
0
雪    币: 193
活跃值: (51)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
13
snort源代码中,有个mSplit函数,可以作为参考。
2018-10-12 18:08
0
游客
登录 | 注册 方可回帖
返回
//