吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1704|回复: 7
收起左侧

[其他转载] C++调用boost库遍历INI文件

[复制链接]
JerusalemSky 发表于 2020-12-3 17:53
自己参考腾讯云作者gongluck的github以及国外stackoverflow写的,先向gongluck程序媛致敬。改掉了原作者基于范围的For循环,在原作者只能获取指定项的功能的基础上加了一个获取全部项的函数,最终数据存储到一个二级Map中了,原来的.h和.cpp整合到一个.h文件了,支持VS2010,已经过测试,随便取用,不谢!

config.7z

4.39 KB, 下载次数: 12, 下载积分: 吾爱币 -1 CB

boost遍历INI文件

免费评分

参与人数 2吾爱币 +2 热心值 +1 收起 理由
香蕉的小黄人 + 1 我很赞同!
月饼煎鱼 + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| JerusalemSky 发表于 2020-12-3 20:20
本帖最后由 JerusalemSky 于 2020-12-3 20:21 编辑

我们的电脑加密了,我直接贴代码出来了:

/*
* @Author: gongluck
* @Date: 2020-03-23 15:11:50
* @last Modified by: Zephaniah
* @Last Modified time: 2020-12-03 15:17:58
*/

// Profile read, dependent on boost

#pragma once

#include <iostream>
#include <map>
#include <vector>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
#include <boost/foreach.hpp>
#include "ErrorCodeDef.h"

class config
{
public:
        int open(const char* configfile)
        {
                if (configfile == nullptr)
                {
                        return ERR_INVALID_DATA;
                }

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

                return RET_OK;
        }
        template <typename T>
        int read(const char* session, const char* key, T& value, const char* configfile = nullptr)
        {
                if (configfile != nullptr && open(configfile) != 0)
                {
                        return ERR_INVALID_DATA;
                }

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

                return RET_OK;
        }
        int read1Section(const char* section,
                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 ERR_INVALID_DATA;
                }

                try
                {
                        auto lvbtItems = lvptProperties_.get_child(section);

                        //const auto& i = lvbtItems.begin();
                        BOOST_FOREACH(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 ERR_INVALID_DATA;
                }

                return RET_OK;
        }

        int readall(const char* configfile)
        {
                std::vector<std::string> vSectionNameLists;

                BOOST_FOREACH(auto & section, lvptProperties_)
                {
                        std::string strSectionName = section.first;
                        vSectionNameLists.emplace_back(strSectionName);
                }

                std::vector<std::string>::iterator itSectionName = vSectionNameLists.begin();
                for(; itSectionName != vSectionNameLists.end(); itSectionName++)
                {
                        std::map<std::string, std::string> mapSection;

                        std::vector<std::pair<std::string, std::string>> results;

                        if (read1Section(itSectionName->c_str(), results, configfile) != 0)
                        {
                                /*std::cerr << __FILE__ << " : " << __LINE__ << " : "
                                        << " can not open " << configfile << std::endl;*/
                                return ERR_INVALID_DATA;
                        }

                        BOOST_FOREACH(auto& key , results)
                        {
                                mapSection.emplace(key);
                        }
                        m_map4AllItems.emplace(std::make_pair <std::string, std::map<std::string, std::string>>(*itSectionName, mapSection));
                }

                return RET_OK;
        }

public:
        std::map<std::string, std::map<std::string, std::string>> m_map4AllItems;
private:
        boost::property_tree::ptree lvptProperties_;
};

dengmengzhao
wujl82 发表于 2020-12-3 18:07
头像被屏蔽
我爱小白兔 发表于 2020-12-3 18:11
renpeng009 发表于 2020-12-3 19:04
乱码,还真的不能谢楼主
 楼主| JerusalemSky 发表于 2020-12-3 20:22
renpeng009 发表于 2020-12-3 19:04
乱码,还真的不能谢楼主

已贴源码
 楼主| JerusalemSky 发表于 2020-12-3 20:24
我爱小白兔 发表于 2020-12-3 18:11
头文件打开乱码啊!notepad++ 和 记事本打开都乱码。

已贴源码
b23526 发表于 2020-12-3 20:32
一个二进制的头文件?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 21:52

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表