65.9K
CodeProject 正在变化。 阅读更多。
Home

C++ 配置文件解析器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.23/5 (13投票s)

2008年5月17日

LGPL3

1分钟阅读

viewsIcon

163959

downloadIcon

3771

一个基于 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

历史

  • 首次发布。
© . All rights reserved.