前言
在C++的项目中,我们可以选择使用哪种配置文件?选择配置文件的两个依据可能是:
配置数据本身的复杂性。应用程序的编程语言是否具有用于解析文件格式的现有强大库
具体可参考:Config Files: INI, XML, JSON, YAML, TOML
在C++中,Boost.PropertyTree是一个保存了多个属性值的树形数据结构, 它可以用类似路径的简单方式访问任意节点的属性,而且每个节点都可以用类似STL的风格遍历子节点。property_tree特别适用于应用程序的配置数据处理, 它可以解析XML、JSON、INI格式的文本数据,使用它能够减轻开发配置管理的工作。
但是XML、JSON、INI这三种格式,我都没选。INI比较简单,不够花里胡哨;JSON不能写注释;XML有些复杂。阅读Config Files: INI, XML, JSON, YAML, TOML后, 我选择toml-lang/toml作为配置文件格式。(INI可能是更好的选择。但好玩起见,尝试使用TOML)
TOML配置文件的使用
见官方文档。
TOML:TOML文档tomlplusplus:TOML C++ API实现
TOML使用demo
下面代码来自:da1234cao/FreeFile
配置文件如下所示,包含字符串,数组,表。
# TOML中的单引号是文字常量,不允许转义# handle.exe文件路径handle = '.\handle.exe'# 被进程占用的文件路径freeFiles = ['D:\cmake', 'E:\tmp.txt']# 运行过程中生成内容路径tmpfile = '.\output.txt'# 日志文件[log]path = '.\freeFile.log'level = 'trace'max_file_size = 1 # MB单位max_files = 3
接口使用如下。
# tomlFetchContent_Declare(tomlplusplusGIT_REPOSITORY /marzer/tomlplusplus.gitGIT_TAG v3.1.0GIT_SUBMODULES "")FetchContent_MakeAvailable(tomlplusplus)include_directories(${tomlplusplus_SOURCE_DIR}/include)add_executable(${PROJECT_NAME} "main.cpp")target_link_libraries(${PROJECT_NAME} PRIVATE tomlplusplus::tomlplusplus)
try {// 从配置文件中提取信息toml::table tlbs;optional<string> handle, tmpfile; // optional异常未捕获set<string> free_files;string log_file_path, logger_name, log_level;size_t max_log_file_size, max_log_files;try {tlbs = toml::parse_file(R"(.\config.toml)");handle = tlbs["handle"].value<string>();tmpfile = tlbs["tmpfile"].value<string>();const toml::array &freeFiles = *tlbs.get_as<toml::array>("freeFiles");for (int i = 0; i < freeFiles.size(); i++) {free_files.insert(freeFiles[i].value<string>().value());}log_file_path = tlbs["log"]["path"].value<string>().value();log_level = tlbs["log"]["level"].value<string>().value();max_log_file_size = tlbs["log"]["max_file_size"].value<int>().value();max_log_files = tlbs["log"]["max_files"].value<int>().value();} catch (const toml::parse_error& err) {cerr << "Parsing failed:\n" << err << "\n";return 1;}......