前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++读取配置文件

C++读取配置文件

作者头像
gongluck
发布2020-03-25 17:33:08
3.7K0
发布2020-03-25 17:33:08
举报
文章被收录于专栏:C++C++

代码地址

https://github.com/gongluck/Code-snippet/tree/master/cpp/config

需求

开发中,读取配置文件信息必不可少。Windows平台有现成的API可用,也很方便。但是一旦项目迁移到Linux平台下,原先在Windows平台下的代码就全部作废。所以,实现一套跨平台的配置文件读取功能代码可以节省不少的劳动力。

实现

依赖于boost的ini_parser,可以实现跨平台读取ini格式的配置文件。

代码语言:javascript
复制
// config.h
/*
 * @Author: gongluck 
 * @Date: 2020-03-23 15:11:50 
 * @Last Modified by: gongluck
 * @Last Modified time: 2020-03-23 15:17:58
 */

// Profile read, dependent on boost

#pragma once

#include <iostream>
#include <vector>
#include <boost/property_tree/ptree.hpp>

namespace gconf
{
class config
{
public:
    int open(const char *configfile);
    template <typename T>
    int read(const char *session, const char *key, T &value, const char *configfile = nullptr)
    {
        if (configfile != nullptr && open(configfile) != 0)
        {
            return -1;
        }

        try
        {
            auto lvbtItems = lvptProperties_.get_child(session);
            value = lvbtItems.get<T>(key);
        }
        catch (std::exception &e)
        {
            std::cerr << __FILE__ << " : " << __LINE__ << " : " << e.what() << std::endl;
            return -1;
        }

        return 0;
    }
    int readall(const char *session,
                std::vector<std::pair<std::string, std::string>> &results,
                const char *configfile = nullptr);

private:
    boost::property_tree::ptree lvptProperties_;
};
} // namespace gconf
代码语言:javascript
复制
// config.cpp
/*
 * @Author: gongluck 
 * @Date: 2020-03-23 15:13:13 
 * @Last Modified by: gongluck
 * @Last Modified time: 2020-03-23 15:17:56
 */

#include "config.h"
#include <boost/property_tree/ini_parser.hpp>

namespace gconf
{
int config::open(const char *configfile)
{
    if (configfile == nullptr)
    {
        return -1;
    }

    try
    {
        boost::property_tree::ini_parser::read_ini(configfile, lvptProperties_);
    }
    catch (std::exception &e)
    {
        std::cerr << __FILE__ << " : " << __LINE__ << " : " << e.what() << std::endl;
        return -1;
    }

    return 0;
}

int config::readall(const char *session,
                    std::vector<std::pair<std::string, std::string>> &results,
                    const char *configfile /*= nullptr*/)
{
    if (configfile != nullptr && open(configfile) != 0)
    {
        std::cerr << __FILE__ << " : " << __LINE__ << " : "
                  << " can not open " << configfile << std::endl;
        return -1;
    }

    try
    {
        auto lvbtItems = lvptProperties_.get_child(session);
        for (const auto &i : lvbtItems)
        {
            results.push_back(std::make_pair(i.first.data(), i.second.data()));
        }
    }
    catch (std::exception &e)
    {
        std::cerr << __FILE__ << " : " << __LINE__ << " : " << e.what() << std::endl;
        return -1;
    }

    return 0;
}
} // namespace gconf
代码语言:javascript
复制
// testcode
#include <iostream>

#include "../config/config.h"

#define CHECKRET(ret)\
if(ret != 0)\
{\
    std::cin.get();\
    return ret;\
}

int main()
{
    gconf::config conf;
    auto ret = conf.open("./config.ini");
    CHECKRET(ret);
    int file = 0;
    ret = conf.read<int>("log", "file", file);
    CHECKRET(ret);
    std::vector<std::pair<std::string, std::string>>kvs;
    ret = conf.readall("log", kvs);
    CHECKRET(ret);
    return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码地址
  • 需求
    • 开发中,读取配置文件信息必不可少。Windows平台有现成的API可用,也很方便。但是一旦项目迁移到Linux平台下,原先在Windows平台下的代码就全部作废。所以,实现一套跨平台的配置文件读取功能代码可以节省不少的劳动力。
    • 实现
      • 依赖于boost的ini_parser,可以实现跨平台读取ini格式的配置文件。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档