自定义读取配置文件类(有待完善)

#ifndef TG_CONFIG_H
#define TG_CONFIG_H

#include<string.h>
#include<vector>
#include<map>
#include<set>
#include <fstream>
#include<iterator>

class tg_config
{
public:
    tg_config (){}
    ~tg_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;
    tg_config(const tg_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;
    }
};

#endif // TG_CONFIG_H

int main()
{
    char* fname = "config.ini";
    std::cout<<"----------------------------"<<fname<<"---------------------------\n";
    tg_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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值