文档章节

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

for。
 for。
发布于 2015/12/28 21:40
字数 280
阅读 276
收藏 1

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


© 著作权归作者所有

共有 人打赏支持
for。

for。

粉丝 86
博文 47
码字总数 18257
作品 0
深圳
程序员
私信 提问
加载中

评论(1)

h
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文件,还是其他方式,小白一枚,烦请解答
用cpptoml 读取 TOML 格式配置文件

@for 你好,想跟你请教个问题:关于你的博文:使用cpptoml 读取 TOML 格式配置文件,好像并没有给出很好的解释,能不能再具体点呢,有没有用c试过?

hhello-wow
2016/11/26
174
3
小型配置脚本语言--TOML

TOML -> Tom's Obvious, Minimal Language. TOML 类似 INI 配置的语法,但更好!TOML 的目标是成为一个极简的配置文件格式。TOML 被设计成可以无歧义地被映射为哈希表,从而被多种语言解析。...

匿名
2013/02/25
4.7K
2
PhalGo-Viper获取配置

PhalGo-Viper获取配置 viper项目地址:https://github.com/spf13/viper 什么是viper viper是国外大神spf13编写的开源配置解决方案,viper拥有一下功能以及特性如下: 设置默认值 从JSON,toml ...

喵了_个咪
2016/06/01
188
0
TOML-to-Go : 帮你快速生成 Go 结构体

TOML 的目标是成为一个极简的配置文件格式。TOML 被设计成可以无歧义地被映射为哈希表,从而被多种语言解析。 通过 toml-to-go 提供的 Web UI,可以方便的将 TOML 转换成 Golang 结构体。 在...

xuri
03/16
0
0
将 TOML 转换为 Go 结构体--TOML-To-Go

TOML 的目标是成为一个极简的配置文件格式。TOML 被设计成可以无歧义地被映射为哈希表,从而被多种语言解析。 通过 toml-to-go 提供的 Web UI,可以方便的将 TOML 转换成 Golang 结构体。 在...

xuri
2016/08/20
557
0

没有更多内容

加载失败,请刷新页面

加载更多

各种视频监控上墙方案的比较

方案1、一使用 DVR 、NVR 直接显示上墙 不得不说,这种办法是成本最低廉的,但这里有不少限制: 无法实现分散点的集中上墙。譬如连锁经营的酒店,如果我在总部建立一个集中上墙的环境,这个就...

PeakFang-BOK
8分钟前
1
0
netfilter 和 iptables

一. netfilter 1. 什么是entfilter 和 iptables netfilter指整个项目名 在这个项目里面,netfilter特指内核中的netfilter框架, iptables指用户空间的配置工具。 netfilter在协议栈中添加了5...

Fc丶
23分钟前
0
0
搞定了微信小程序富文本渲染解决方案-后端渲染方案Html2Wxml2J

先介绍一下最近遇到的问题: 最近小程序项目中有文章详情页需要渲染富文本,微信小程序官方提供的<rich-text>是个弱鸡,很多标签不支持,用起来也麻烦,性能也不咋地。 吐槽完了,我们决定寻...

山东-小木
30分钟前
0
0
Vue.js 内置指令

Vue.js 的指令是带有特殊前缀 “v-“ 的 HTML 特性。它绑定一个表达式,并将一些特性应用到 DOM 上。 一、基本指令 1.1 v-cloak v-cloak 不需要表达式,它会在 Vue 实例结束编译时从绑定的 ...

Mr_ET
47分钟前
2
0
怎么样在谷歌找文章

使用这些前缀:(不懂英文经常在谷歌搜出些产品词——明明我要文章——,其实加些前缀就出来了 ,如tips amazon tool,step amazon tool) top 10 ... 10 tips to ... what is ... how to ... ...

阿锋zxf
51分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部