嵌入式Qt开发中配置文件的尝试——TOML

嵌入式Qt开发中配置文件的尝试——TOML,第1张

嵌入式Qt开发中配置文件的尝试——TOML
  • 1 起因
  • 2 关于 QSetting
  • 3 重新寻找方案 TOML
    • 3.1 TOML 初体验
  • 4 后话

1 起因

在大多数项目中,系统启动时都需要读取一份配置文件,用于初始化系统的配置。由于这是一个嵌入式Qt项目,很自然的,想到了使用 Qt 自带的 QSetting类 来实现配置文件的功能。

2 关于 QSetting

思路也很简单,QSetting 创建 ini配置文件,然后程序读取修改就行。不过我在调试程序配置功能的过程中,发现了一个bug,ini 配置文件对中文的支持似乎不是很好。
我已经设置了配置文件的编码格式为 utf-8。

可是在调试过程中,location属性还是有几率变成乱码。

3 重新寻找方案 TOML

网上搜索到的常用的配置文件格式,基本上为 ini,json以及 yaml,我觉得要么就是中文支持较差,要么就是不太直观或者配置格式太复杂。找来找去,敲定了TOML,决定尝试使用一下。
TOML中文介绍:TOML教程

3.1 TOML 初体验

TOML 库,我选择了 toml11,看 github 上的评价应该还不错。
GitHub链接:toml11。

写了一段简单的程序来测试该库方便使用的程度:

  • 创建 toml 配置文件
  • 写入配置内容
  • 解析配置文件
  • 修改配置文件内容
/**
 * @brief toml11库的示例程序
 */
#include "toml.hpp"
#include 
#include 


int main(void)
{
    /* 创建配置toml文件 */
    std::ofstream test_file;
    test_file.open("./config.toml", std::ios::out | std::ios::app);
    if (!test_file.is_open()) {
        exit(-1);
    }

    /* 写入的数据 */
    const toml::value data {
    {"common", {{"version", 0.1}, {"location", "理塘"}}},
    {"user",   {{"name", "lewin"}, {"password", "123456"}}},
    {"server", {{"ip", "192.168.31.1"}, {"port", 9099}}},
    };

    /* 流方式写入配置文件 */
    test_file << std::setw(80) << data;
    test_file.close();

    /* 解析配置文件 */
    auto config_data = toml::parse("./config.toml");

    /* 获取 common 中的 location */
    auto common_data = toml::find(config_data, "common");
    std::string location = toml::find<std::string>(common_data, "location");

    /* 修改为郫都 */
    common_data.at("location") = "郫都";	// 修改location
    config_data.at("common") = common_data;	// 数据写回config_data

    /* 重新将所有内容写入原文件 */
    std::ofstream ofs("./config.toml");
    ofs << std::setw(80) << config_data;	// 写回原文件
    ofs.close();

    exit(0);
}

经过测试,我发现 toml11 库的优点:

  • 配置格式简洁明了,人工修改也容易,不像 json 多级嵌套后简直看花眼
  • 解析方式简单易用
  • 由于只支持 utf-8 编码,对中文支持不错,不会出现乱码

缺点也很明显:

  • 内容配置不大方便,搞得像 json 一样多级嵌套
  • 修改功能很糟糕,居然需要将所有配置信息读取出来,然后修改一部分再全部写回文件中去,没有单独修改一个特定属性的功能
  • 没有 QSetting 良好的包装,很多步骤需要自己实现

这番体验下来,QSetting类 的确比 toml11 好用,如果仅为了良好的中文支持,选择了 toml11 ,就会导致配置文件过程变得复杂,博主内心也是比较纠结,所以暂时还是保持 ini 配置文件不动,toml 留作备份方案。

4 后话

TOML 的 C++ 库还有一个 tomlplusplus,我测试下来比 toml11 好用一些,多了修改属性的功能,不过作者说该库只支持C++17以上。由于种种原因,嵌入式的交叉编译器版本一般都不会太高,能支持到C++11就很不错了,所以很难使用在嵌入式 Qt 上,所以文章里面并没有讨论 tomlplusplus。

tomlplusplus 的 GitHub 链接:tomlplusplus,有兴趣的朋友可以自己看看。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/875268.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存