//字符串trim函数 string trim(const string& str) { string t = " abd cdi 783 "; //示例字符串 t.erase(0, t.find_first_not_of(" \t\n\r")); // "abd cdi 783 " erase(int i,int j)是擦除从i到j的所有字符(含i,j位) t.erase(t.find_last_not_of(" \t\n\r") + 1); // "abd cdi 783" erase(int n)是擦除第n位置以后(含第n位置)的所有字符 return t; }
注:find_first_not_of(" \t\n\r")返回第一个不是这些字符(空格、制表符、换行、回车)的字符的位置
find_last_not_of函数则是返回从右往左数第一个符合条件的字符
//字符串分割函数 vector<string> split(string str,string pattern){ string::size_type pos; vector<std::string> result; str+=pattern;//扩展字符串以方便操作 int size=str.size();
for(int i=0; i<size; i++) { pos=str.find(pattern,i); if(pos<size){ std::string s=str.substr(i,pos-i); s=trim(s); result.push_back(s); i=pos+pattern.size()-1; } } return result; }
//此处实现一个简单的配置文件读取操作,比定义宏编译速度快 bool LoadFromFile(const string &account_info_file){ //打开文件 ifstream fin; fin.open(account_info_file.c_str()); if (!fin){ printf("get account info failed \n\t may be the file %s not exist!\n",account_info_file.c_str()); return false; }
//按行遍历 string line; while(getline(fin,line)){ line = trim(line); //为空或首字符为"#",则忽略 if (line.empty() || line[0] == '#' ){ continue; }
vector<string> key_value = split(line,"="); if (stricmp(key_value[0].c_str(),SELF_DEFINE_STRING_CONFIG) == 0){ //SELF_DEFINE_STRING_CONFIG是键值对的key,而self_define_string_config_是键值对的value string self_define_string_config_ = key_value[1]; }
//关闭文件 fin.close(); return true; }