C ++ reads the configuration file

Code address

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

demand

Development, reads the profile information is essential. Windows has a ready-made platform API available, is also very convenient. But once the project is to migrate to the Linux platform, the original code under the Windows platform would become void. So, to achieve a cross-platform configuration file reading function codes can save a lot of labor.

achieve

Depends on the boost of ini_parser, can achieve cross-platform reads the configuration file ini format.

// 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;
}

Guess you like

Origin www.cnblogs.com/gongluck/p/12556982.html