自定义读取配置文件类
#include<iostream>
#include<string.h>
#include<vector>
#include<map>
#include<set>
#include <fstream>
#include<iterator>
class tool_config
{
public:
tool_config (){}
~tool_config(){}
bool open(const char*filename)
{
_map.clear();
std::vector<std::string> lines;
get_lines(filename, lines);
for(auto& str: lines)
{
auto tmp = delet(str);
tmp=trim(tmp);
auto arr = split(tmp);
if(2!=arr.size())
{
continue;
}
auto key = trim(arr[0]);
auto value = trim(arr[1]);
_map.insert(std::make_pair(key, value));
}
return true;
}
const char* get(const char*section, const char*key, const char*defval)
{
char k[64];
sprintf(k,"%s.%s", section, key);
return get(k, defval);
}
const char* get(const char*key,const char*defval)
{
auto it=_map.find(key);
return it==_map.end() ? defval : it->second.c_str();
}
std::set<const char*> keys()
{
std::set<const char*> ret;
for(auto it:_map)
ret.insert(it.first.c_str());
return std::move(ret);
}
bool contains(const char*key)
{
return _map.find(key)!=_map.end();
}
bool contains(const char*section,const char*key)
{
char tmp[64];
snprintf(tmp,255,"%s.%s",section,key);
return contains(tmp);
}
void print(std::ostream&o)
{
for(auto &m:_map)
o<<m.first<<"="<<m.second<<"\n";
o<<std::endl;
}
private:
std::map<std::string, std::string> _map;
tool_config(const tool_config&)=delete;
void trim(char*begin,char*end)
{
char*e1=end;
for(;e1>begin;--e1)
{
if(!std::isspace(e1[-1]))
break;
}
char*b1=begin;
for(;b1<e1;++b1)
{
if(!std::isspace(*b1))
break;
}
memmove(begin,b1,e1-b1);
begin[e1-b1]='\0';
}
bool get_lines(const char*filename, std::vector<std::string>& out_data)
{
std::vector<char> arr;
arr.reserve(1024*2);
std::ifstream fstream(filename, std::ios_base::binary);
if(!fstream)
{
return false;
}
//unsetf(。。。) -- 取消。。。格式 设置
//cin.unsetf(ios::skipws); -- 取消 cin 输入 跳过空白 的 默认 设置
fstream.unsetf(std::ios::skipws);//Skip white space. 跳过空白(空格,表格键。。。。)
std::copy(std::istream_iterator<char>(fstream),std::istream_iterator<char>(), std::back_inserter(arr));
char *start=&arr[0];
char *end = start;
while (*end)
{
if('\r'==*end && '\n'==*(end+1))
{
if(end>start)
{
std::string str(start, end-start);
out_data.push_back(str);
}
end++;
start=end+1;
}
end++;
}
if(end>start)
{
std::string str(start, end-start);
out_data.push_back(str);
}
return true;
}
std::string trim(std::string& str)
{
char* begin = const_cast<char*>(str.c_str());
trim(begin, begin+str.length());
return str.c_str();
}
std::vector<std::string> split(std::string& str)
{
std::vector<std::string> result;
auto index = str.find_first_of('=');
if (index != std::string::npos)
{
result.push_back(str.substr(0, index));
result.push_back(str.substr(index+1));
}
return result;
}
//去掉#
std::string delet(std::string& str)
{
auto index = str.find_first_of('#');
if (index != std::string::npos)
{
return str.substr(0,index);
}
return str;
}
};
int main()
{
char* fname = "config.ini";
std::cout<<"----------------------------"<<fname<<"---------------------------\n";
tool_config config;
config.open(fname);
config.print(std::cout);
std::cout<<"-------------------------------------------------------\n";
for(auto k:config.keys())
printf("%s=%s\n",k,config.get(k,""));
printf("contains(%s)=%d\n","main.file",config.contains("main.file"));
printf("contains(%s)=%d\n","db.host",config.contains("db.host"));
return 0;
}
----------------------------config.ini---------------------------
db.charset=utf8
db.conn_timeout=5
db.conn_timeoutrr=
db.host=192.168.0.105
db.passwd=root
db.user=root
service.port=4000
service.recv_timeout=30
service.websocket_url=ws://192.168.0.105:8086
-------------------------------------------------------
service.port=4000
service.recv_timeout=30
service.websocket_url=ws://192.168.0.105:8086
db.host=192.168.0.105
db.charset=utf8
db.user=root
db.passwd=root
db.conn_timeoutrr=
db.conn_timeout=5
contains(main.file)=0
contains(db.host)=1