- 1 起因
- 2 关于 QSetting
- 3 重新寻找方案 TOML
- 3.1 TOML 初体验
- 4 后话
在大多数项目中,系统启动时都需要读取一份配置文件,用于初始化系统的配置。由于这是一个嵌入式Qt项目,很自然的,想到了使用 Qt 自带的 QSetting类 来实现配置文件的功能。
2 关于 QSetting思路也很简单,QSetting 创建 ini配置文件,然后程序读取修改就行。不过我在调试程序配置功能的过程中,发现了一个bug,ini 配置文件对中文的支持似乎不是很好。
我已经设置了配置文件的编码格式为 utf-8。
可是在调试过程中,location属性还是有几率变成乱码。
网上搜索到的常用的配置文件格式,基本上为 ini,json以及 yaml,我觉得要么就是中文支持较差,要么就是不太直观或者配置格式太复杂。找来找去,敲定了TOML,决定尝试使用一下。
TOML中文介绍: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,有兴趣的朋友可以自己看看。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)