skip to main
|
skip to sidebar
充实过好每一天!
我的工作,也就是我的生活~~~
2007年9月16日星期日
A C++ Class to read Configuration Files
A C++ Class to read Configuration Files
This class uses the class Chameleon. Chameleon is a string to/from double conversion class.
Here's ConfigFile.h
ConfigFile.h
#ifndef __CONFIG_FILE_H__
#define __CONFIG_FILE_H__
#include
#include
#include "Chameleon.h"
class ConfigFile {
std::map
content_;
public:
ConfigFile(std::string const& configFile);
Chameleon const& Value(std::string const& section, std::string const& entry) const;
Chameleon const& Value(std::string const& section, std::string const& entry, double value);
Chameleon const& Value(std::string const& section, std::string const& entry, std::string const& value);
};
#endif
Here's ConfigFile.cpp
ConfigFile.cpp
#include "ConfigFile.h"
#include
std::string trim(std::string const& source, char const* delims = " \t\r\n") {
std::string result(source);
std::string::size_type index = result.find_last_not_of(delims);
if(index != std::string::npos)
result.erase(++index);
index = result.find_first_not_of(delims);
if(index != std::string::npos)
result.erase(0, index);
else
result.erase();
return result;
}
ConfigFile::ConfigFile(std::string const& configFile) {
std::ifstream file(configFile.c_str());
std::string line;
std::string name;
std::string value;
std::string inSection;
int posEqual;
while (std::getline(file,line)) {
if (! line.length()) continue;
if (line[0] == '#') continue;
if (line[0] == ';') continue;
if (line[0] == '[') {
inSection=trim(line.substr(1,line.find(']')-1));
continue;
}
posEqual=line.find('=');
name = trim(line.substr(0,posEqual));
value = trim(line.substr(posEqual+1));
content_[inSection+'/'+name]=Chameleon(value);
}
}
Chameleon const& ConfigFile::Value(std::string const& section, std::string const& entry) const {
std::map
::const_iterator ci = content_.find(section + '/' + entry);
if (ci == content_.end()) throw "does not exist";
return ci->second;
}
Chameleon const& ConfigFile::Value(std::string const& section, std::string const& entry, double value) {
try {
return Value(section, entry);
} catch(const char *) {
return content_.insert(std::make_pair(section+'/'+entry, Chameleon(value))).first->second;
}
}
Chameleon const& ConfigFile::Value(std::string const& section, std::string const& entry, std::string const& value) {
try {
return Value(section, entry);
} catch(const char *) {
return content_.insert(std::make_pair(section+'/'+entry, Chameleon(value))).first->second;
}
}
A test program
ConfigFileTest.cpp
ConfigFileTest.cpp
#include "ConfigFile.h"
#include
int main() {
ConfigFile cf("config.txt");
std::string foo;
std::string water;
double four;
foo = cf.Value("section_1","foo" );
water = cf.Value("section_2","water");
four = cf.Value("section_2","four" );
std::cout << foo << std::endl;
std::cout << water << std::endl;
std::cout << four << std::endl;
return 0;
}
Here's the configuration file that's being read by the test program:
config.txt
[section_1]
foo = bar
water= h2o
[section_2]
foo = foo
water= wet
four = 4.2
Compiling the test program with n:
g++ -Wall Chameleon.cpp ConfigFile.cpp ConfigFileTest.cpp -o ConfigFileTest.exe
Thanks
My special thanks go to Dieter Vrancken who improved this class, see also this entry in my blog.
Thanks also to Lars Schouw who pointed out an error on this page and Christian Decker who spotted an error in the code.
没有评论:
发表评论
较新的博文
较早的博文
主页
订阅:
博文评论 (Atom)
博客归档
▼
2007
(269)
►
十一月
(1)
►
十月
(8)
▼
九月
(141)
常见的几个Qt编程问题的处理
TinyXml学习笔记
实战TinyXML
[trac]有用的插件
C/C++跨平台ini文件读写API (已更新)
C++解析XML -- TinyXml
解析XML的利器-TinyXML
TinyXml在游戏中的作用
有关TinyXML使用的简单总结
如何监测内存泄漏
Qt4.2.3编译记录
QT4 和 VS2005 SP1 编译错误 C2244
解决Visual Studio 2005 SP1编译QT代码的BUG
building qt4 with vc2005
練習寫 TracMacro - [[TicketStatus]]
水滴石穿C语言之可变参数问题
关于可变宏参数
Implementing dprintf() with __VA_ARGS__
VC++6.0中内存泄漏检测
好用的 CopySourceAsHtml,我的中文修正版
Linux 系统内核空间与用户空间通信的实现与分析
netlink编译出错
makefile详解 嵌套执行make,定义命令包 十六
我的Linux PC开发环境
开发规范参考
如何编写代码才能使得效率高
C/C++中判断某一文件或目录是否存在
利用c++标准库函数实现判断文件存在 CSDN Blog推出文章指数概念,文章指数是对Blog...
检测文件存在的四种方法。test if a File exist or not?
使用C语言的函数rename()来进行文件的move
File Access in C++
C++ FileSize() function
AutoLISP Highlighter
在blogger文章中显示源代码
Directory Traversal using Recursion by Glen E. Gar...
在Beta Blogger中显示源代码的办法
Folder Utility: Create Path, Remove Folder, Remove...
What is the code in C++ for MKDIR?
File Access and Directory System Calls
UDT Frequent Asked Questions
/proc文件系统用于内核调试
Proc File System : Introduction
Access the Linux kernel using the /proc filesystem
关于C结构体bit field
c程序中使用exec()和system()那个更好
va_list
fstream 和 中文路径
trac 不得不爱之Account Manager Plugin
Subversion與Trac合用時的檔案庫Layout考量
Trac的配置
Trac 管理小記(一):安裝 plugin 注意事項
在 Windows 上使用 Trac on Apache - 安裝與設定篇
在 Windows 上使用 Trac on Apache - 專案建置篇
使用 memleak 检查和调试内存泄漏
在 Windows 上使用 Trac on Apache - 使用說明篇
(C++) Convert a std::string to upper case
A C++ Class to read Configuration Files
C++ Config File Library
Flextronics Placement Papers and Sample Papers
Steve's 'Cute Code' collection.
呕心沥血之后,能够发邮件的SVNNotify
SVN::Notify
从CVS迁移到SVN
Subversion备份
linux内核模块加载
[linux,内核编程]insmod时的内核版本问题的解决方案
Linux 下的多进程编程
insmod内核版本问题解决方法
RUDP:可靠用户数据报协议
runauto.. 文件夹删除方法
便利的开发工具 CppUnit 快速使用指南 选择自 mounTon 的 Blog
CppUnit源码解读
20070801 trac apache 密码 权限
[翻译]压缩Subversion备份【English Version】
Trac on Apache - 使用说明
[Z]Trac在Windows下的安装配置
为trac增加用户
[浩南艰辛原创]Apache 2.2 + SVN 1.44 + Trac 0.10.4 安装全过程
apache svn+trac 配置
apache svn+trac 配置
# Trac
无废话Apache+Tomcat配置
JDK1.6 + Tomcat6 + Apache2.2
Apache HTTP Server 与 Tomcat 的三种连接方式介绍
SVN Web Client中文修订版下载
关于用SVNWebClient提交中文文件名出错的问题
Apache+Tomcat中支持“UTF-8”编码的中文地址
viewvc 搭建笔记
让 viewvc 默认显示GB2312编码
一个生产环境使用的apache module– viewvc权限控制)
ViewVC 集成 Subversion, 要说爱你不容易!!! [原创]
trac集成svn的权限问题, 请指教
安装Trac服务器
基于Trac的项目管理系统
apache+svn+trac项目管理
Trac 工具彻底了解
[trac]有用的插件
trac简易指南
Trac——发送邮件通知
SVN+Trac的配置笔记
►
八月
(80)
►
七月
(39)
我的简介
陈浩
查看我的完整个人资料
没有评论:
发表评论