来源: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<<(uint32)token.nextFloatToken()); } |
-
2011-05-25
-
2011-05-25
-
2011-05-25