C ++ lee el archivo de configuración

dirección de código

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

demanda

Desarrollo, lee la información de perfil es esencial. Windows tiene una API de la plataforma ya preparada disponibles, es también muy conveniente. Pero una vez que el proyecto es migrar a la plataforma Linux, el código original bajo la plataforma Windows se convertiría en vacío. Por lo tanto, para lograr un archivo de configuración multi-plataforma de leer los códigos de función puede ahorrar una gran cantidad de mano de obra.

realización

Depende del impulso de ini_parser, se puede lograr multiplataforma lee el formato del ini archivo de configuración.

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

Supongo que te gusta

Origin www.cnblogs.com/gongluck/p/12556982.html
Recomendado
Clasificación