C ++ lê o arquivo de configuração

endereço código

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

demanda

Desenvolvimento, lê as informações de perfil é essencial. O Windows tem uma plataforma API ready-made disponíveis, também é muito conveniente. Mas uma vez que o projeto é migrar para a plataforma Linux, o código original sob a plataforma Windows se tornaria nula. Assim, para conseguir um arquivo de configuração de plataforma cruzada leitura de códigos de função podem salvar um monte de trabalho.

realização

Depende do impulso de ini_parser, pode conseguir cross-platform lê o formato do ini arquivo de configuração.

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

Acho que você gosta

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