zoukankan      html  css  js  c++  java
  • C++读取配置文件

    代码地址

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

    需求

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

    实现

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

    // 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
    
    // 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
    
    // 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;
    }
    
  • 相关阅读:
    对文件下载的补充
    IBatisNet1.5学习配置篇
    IBatisnet Facility 的几种配置
    ERP术语 英文对照(部分)(参考)
    使用IBatisNet + Castle 开发DotNet软件
    JS屏蔽浏览器右键菜单
    恢复误删数据(SQL Server 2000)--Log Explorer
    IBatisNet1.5 映射文件Parameter Maps and Inline Parameters
    深圳电话订票基本步骤及所有的取票点地址电话
    DataFormatString格式化字符串
  • 原文地址:https://www.cnblogs.com/gongluck/p/12556982.html
Copyright © 2011-2022 走看看