使用cpptoml 读取 TOML 格式配置文件
博客专区 > for_ 的博客 > 博客详情
使用cpptoml 读取 TOML 格式配置文件
for_ 发表于2年前
使用cpptoml 读取 TOML 格式配置文件
  • 发表于 2年前
  • 阅读 172
  • 收藏 1
  • 点赞 0
  • 评论 1

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 使用cpptoml 读取 TOML 格式配置文件

1. 获取cpptoml

只需要 cpptoml.h 。

$ git clone https://github.com/skystrife/cpptoml.git

2. TOM配置

mysql.toml配置文件如下:

[Title]
Author="lowkey2046"

[MySQL]
Host="127.0.0.1"
Port=3306
Database="testdb"
Username="root"
Password="lowkey2046"

3. C++代码

mysqltoml.cpp 文件如下:

#include <iostream>
#include "cpptoml.h"

struct MySQLArg{
    std::string host;
    int32_t port;
    std::string database;
    std::string username;
    std::string password;
};

bool readMySQLConfig(const char *file, MySQLArg &mysqlArg);

int main(int argc, char **argv)
{
    char filename[] = "./mysql.toml";
    MySQLArg mysqlArg;

    if (readMySQLConfig(filename, mysqlArg)) {
        std::cout << "    Host:" << mysqlArg.host << std::endl;
        std::cout << "    Port:" << mysqlArg.port << std::endl;
        std::cout << "Database:" << mysqlArg.database << std::endl;
        std::cout << "Username:" << mysqlArg.username << std::endl;
        std::cout << "Password:" << mysqlArg.password << std::endl;
    }

    return 0;
}

bool readMySQLConfig(const char *file, MySQLArg &mysqlArg)
{
    std::shared_ptr<cpptoml::table> g;
    try {
        g = cpptoml::parse_file(file);
    } catch (const cpptoml::parse_exception &e) {
        std::cerr << "parse_file error: " << e.what() << std::endl;
        return false;
    }

    auto Strings = [&](const char *key, const char * value)->std::string {
        if (g->contains_qualified(key)) {
            return g->get_qualified(key)->as<std::string>()->get();
        }
        if (!value)
            return std::string();
        return std::string(value);
    };

    auto Integer = [&](const char *key, int value)->int {
        if (g->contains_qualified(key)) {
            auto integer = g->get_qualified(key)->as<int64_t>()->get();
            return static_cast<int>(integer);
        }
        return value;
    };


    mysqlArg.host = Strings("MySQL.Host", "127.0.0.1");
    mysqlArg.port = Integer("MySQL.Port", 3306);
    mysqlArg.database = Strings("MySQL.Database", "testdb");
    mysqlArg.username = Strings("MySQL.Useranme", "root");
    mysqlArg.password = Strings("MySQL.Password", "123456");

    return true;
}

4. 编译

$ g++ -std=c++11 mysqltoml.cpp -o mysqltoml

5. 执行

$ ./mysqltoml 
    Host:127.0.0.1
    Port:3306
Database:testdb
Username:root


标签: toml c++
共有 人打赏支持
for_
粉丝 75
博文 47
码字总数 18257
评论 (1)
hhello-wow
你好,谢谢你的回复,我大概看了下c源码,准备用起来出现了问题,能否帮忙解决,我是cmake之后make 出现
make2: *** No rule to make target 'RAGEL-NOTFOUND', needed by 'toml_parse.c'. Stop.
CMakeFiles/Makefile2:104: recipe for target 'CMakeFiles/toml.dir/all' failed
make1: *** [CMakeFiles/toml.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

这样的错误,'toml_parse.c',在源码中是以.rl格式出现的,是否需要将其拷贝为c文件,还是其他方式,小白一枚,烦请解答
×
for_
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: