马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
[table][tr][td]来源:IIEEG02-24-2011
1. Tokenizer类 - 实现
// @author - Patric Ye
// @Date - 13 September, 2010
// @Version - 0.1
#include "stdafx.h"
#include
using namespace std;
class CStringTokenizer {
public:
CStringTokenizer(const std::string& _str, const std::string& _delim);
~CStringTokenizer(){};
int countTokens();
bool hasMoreTokens();
string nextToken();
int nextIntToken();
double nextFloatToken();
string nextToken(const std::string& delim);
string remainingString();
string filterNextToken(const std::string& filterStr);
private:
string token_str;
string delim;
};
CStringTokenizer::CStringTokenizer(const string& _str, const string& _delim)
{
if ((_str.length() == 0) || (_delim.length() == 0)) return;
token_str = _str;
delim = _delim;
/*
Remove sequential delimiter
*/
unsigned int curr_pos = 0;
while(true)
{
if ((curr_pos = token_str.find(delim,curr_pos)) != string::npos)
{
curr_pos += delim.length();
while(token_str.find(delim,curr_pos) == curr_pos)
{
token_str.erase(curr_pos,delim.length());
}
}
else
{
break;
}
}
/*
Trim leading delimiter
*/
if (token_str.find(delim,0) == 0)
{
token_str.erase(0,delim.length());
}
/*
Trim ending delimiter
*/
curr_pos = 0;
if ((curr_pos = token_str.rfind(delim)) != string::npos)
{
if (curr_pos != (token_str.length() - delim.length())) return;
token_str.erase(token_str.length() - delim.length(),delim.length());
}
}
int CStringTokenizer::countTokens() {
unsigned int prev_pos = 0;
int num_tokens = 0;
if (token_str.length() > 0)
{
num_tokens = 0;
unsigned int curr_pos = 0;
while(true)
{
if ((curr_pos = token_str.find(delim,curr_pos)) != string::npos)
{
num_tokens++;
prev_pos = curr_pos;
curr_pos += delim.length();
}
else
{
break;
}
}
return ++num_tokens;
}
else
{
return 0;
}
}
bool CStringTokenizer::hasMoreTokens()
{
return (token_str.length() > 0);
}
string CStringTokenizer::nextToken()
{
if (token_str.length() == 0)
{
return "";
}
string tmp_str = "";
unsigned int pos = token_str.find(delim,0);
if (pos != string::npos)
{
tmp_str = token_str.substr(0,pos);
token_str = token_str.substr(pos+delim.length(),token_str.length()-pos);
}
else
{
tmp_str = token_str.substr(0,token_str.length());
token_str = "";
}
return tmp_str;
}
int CStringTokenizer::nextIntToken()
{
return atoi(nextToken().c_str());
}
double CStringTokenizer::nextFloatToken()
{
return atof(nextToken().c_str());
}
string CStringTokenizer::nextToken(const string& delimiter)
{
if (token_str.length() == 0)
{
return "";
}
string tmp_str = "";
unsigned int pos = token_str.find(delimiter,0);
if (pos != string::npos)
{
tmp_str = token_str.substr(0,pos);
token_str = token_str.substr(pos + delimiter.length(),token_str.length() - pos);
}
else
{
tmp_str = token_str.substr(0,token_str.length());
token_str = "";
}
return tmp_str;
}
string CStringTokenizer::remainingString()
{
return token_str;
}
string CStringTokenizer::filterNextToken(const string& filterStr)
{
string tmp_str = nextToken();
unsigned int currentPos = 0;
while((currentPos = tmp_str.find(filterStr,currentPos)) != string::npos)
{
tmp_str.erase(currentPos,filterStr.length());
}
return tmp_str;
}
2. Tokenizer类 - 使用
CStringTokenizer token(strHashRange, ",");
while( token.hasMoreTokens() )
{
cout |