///ConfigFile.h 配置文件操作 ///格式如下: /************************************************* #this is comment name = tujiaw date = 2011.10.30 **************************************************/ #ifndef CONFIG_FILE_H_ #define CONFIG_FILE_H_ #include <iostream> #include <fstream> #include <string.h> #include <stdlib.h> #include <map> #include <vector> using namespace std; class ConfigFile { public: ConfigFile(); ~ConfigFile(); bool open(const string file_path); bool save(); string get_string(const string key); unsigned int get_int(const string key); bool set_string(const string key, const string value); bool set_int(const string, const unsigned int value); private: void trim_left_right(string &str); void set_vector_string(const string key, const string value); private: string m_path; vector<string> m_data; map<string, string> m_map; }; #endif // CONFIG_FILE_H
///ConfigFile.cpp #include "ConfigFile.h" #define LINE_LEN 256 ///public ConfigFile::ConfigFile() { } ConfigFile::~ConfigFile() { } bool ConfigFile::open(const string file_path) { bool ret = false; if (file_path.empty()) { return ret; } m_path = file_path; fstream file_in(file_path.c_str(), ios_base::in); if (file_in.is_open()) { string str, left, right; unsigned int len, pos; char szLine[LINE_LEN] = {0}; while (file_in.getline(szLine, LINE_LEN)) { len = strlen(szLine); m_data.push_back(szLine); str.assign(szLine, len); trim_left_right(str); if (str[0] != '#') { pos = str.find('='); left = str.substr(0, pos); right = str.substr(pos+1); trim_left_right(left); trim_left_right(right); m_map.insert(pair<string, string>(left, right)); } bzero(szLine, LINE_LEN); } file_in.close(); ret = true; } return ret; } bool ConfigFile::save() { bool ret = false; fstream file_out(m_path.c_str(), ios_base::out); if (file_out.is_open()) { vector<string>::iterator iter; for (iter=m_data.begin(); iter!=m_data.end(); ++iter) { string str = (*iter); file_out << str << endl; } file_out.close(); ret = true; } return ret; } string ConfigFile::get_string(const string key) { string str = ""; if (!m_map.empty()) { str = m_map[key]; } return str; } unsigned int ConfigFile::get_int(const string key) { unsigned int value = 0; string str = get_string(key); value = atoi(str.c_str()); return value; } bool ConfigFile::set_string(const string key, const string value) { bool ret = false; if (!m_map.empty()) { m_map[key] = value; set_vector_string(key, value); ret = true; } return ret; } bool ConfigFile::set_int(const string key, const unsigned int value) { bool ret = false; if (!m_map.empty()) { char szValue[32] = {0}; sprintf(szValue, "%u", value); m_map[key] = szValue; set_vector_string(key, szValue); ret = true; } return ret; } ///private void ConfigFile::trim_left_right(string &str) { if (!str.empty()) { int i; int len = str.size(); for (i=0; i<len; i++) { if (str[i] != ' ') { break; } } str.erase(0, i); len = str.size(); for (i=len-1; i>0; i--) { if (str[i] != ' ') { break; } } str.erase(i+1, len); } } void ConfigFile::set_vector_string(const string key, const string value) { if (!m_data.empty() && !key.empty()) { vector<string>::iterator iter; string str; for (iter=m_data.begin(); iter!=m_data.end(); ++iter) { str = *iter; trim_left_right(str); int pos1 = str.find('='); int pos2 = (*iter).find('='); int len = (*iter).size(); string substr = str.substr(0, pos1); trim_left_right(substr); string value2 = " "+value; if (str[0]!='#' && substr==key) { (*iter).replace(pos2+1, len-pos2-1, value2); } } } }