C++ 配置文件解析器
一个基于 STL 的 C++ 工具类,用于解析结构化的配置文件。
引言
本文描述了一个小型、轻量级的结构化配置文件解析器。与 INI 文件不同,配置文件可以任意深度地进行子结构化。配置文件支持从先前定义的变量和环境变量扩展符号值。
使用代码
基本用法
考虑以下示例配置文件
# Environment variables used as expansion symbol
# Note: symbol names are case sensitive
tempFolder = %TEMP%
# already defined variables used as expansion symbol
tempSubFolder = %tempFolder%\config-demo
解析就像这样简单
Config config("demo.config", envp);
cout << "tempFolder = '"
<< config.pString("tempFolder") << "'" << endl;
cout << "tempSubFolder = '"
<< config.pString("tempSubFolder") << "'" << endl;
pString()
检索一个未解析的 std::string
值。类 Config
提供了其他方法,这些方法尝试将该值解析为布尔值、双精度浮点数或整数。
Config 子组
配置文件可以包含子组,如以下示例所示
# Sub group example
baseName = Welcome Note
message1 = (
# strings may use ""; it does not make a difference, however.
name = "%baseName% 1"
text = Sample message text
)
message2 = (
name = %baseName% II
text = Another sample message text
)
与传统的 INI 文件不同,子组可以包含进一步的子组,直到任意深度。可以通过名称访问子组,或者可以访问整个子组集合,即 stl::map<string, Config*>&
。
以下代码演示了如何解析所有以特定前缀开头的子组,而无需事先知道确切的数量
// get properties for all subgroups starting with prefix
map<string, Config*> messages = config.getGroups(); // all groups
const string messagePrefix = "message"; // prefix for group name
for (map<string, Config*>::iterator i = messages.begin(); i != messages.
end(); ++i) {
string groupName = i->first;
Config* group = i->second;
// test group name for prefix
if (groupName.substr(0, messagePrefix.length()) == messagePrefix) {
// display group contents
cout << group->pString("name") << ":" << endl;
cout << " " << group->pString("text") << endl;
}
}
有了此功能,该解析器也可以用于结构化输入文档,而不仅仅是配置文件。与 XML 相比,表示更紧凑,解析更简单,并且已经包含了变量扩展。
分发的源代码包含非常简单的错误处理。警告和错误消息记录到控制台。在发生严重错误时,进程将被中止。将源代码集成到项目中时,如果需要,可以考虑将其更改为 C++ 异常处理。
仅使用标准 C++ 功能,因此此代码真正具有跨平台性。包含 MSVS Express 2005 项目文件;使用 GNU g++/Linux 手动构建已成功测试,使用
g++ -o ../configDemo *.cpp
历史
- 首次发布。