自定义读取配置文件类

#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

猜你喜欢

转载自blog.csdn.net/f110300641/article/details/83829809