Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1737392
  • 博文数量: 358
  • 博客积分: 2180
  • 博客等级: 大尉
  • 技术积分: 1810
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-17 13:47
文章分类

全部博文(358)

文章存档

2016年(17)

2015年(55)

2014年(9)

2013年(67)

2012年(181)

2011年(29)

分类: C/C++

2012-08-01 17:01:57

头文件:get_config.h
/****************************************************************************
*   作者:  jasitzhang(张涛)
*   日期:  2011-10-2
*   目的:  读取配置文件的信息,以map的形式存入
*   要求:  配置文件的格式,以#作为行注释,配置的形式是key = value,中间可有空格,也可没有空格
*****************************************************************************/
#ifndef _GET_CONFIG_H_
#define _GET_CONFIG_H_
 
#include
#include
using namespace std;
 
#define COMMENT_CHAR '#'
 
bool ReadConfig(const string & filename, map & m);
void PrintConfig(const map & m);
#endif

  

源文件:get_config.cpp

复制代码
#include "get_config.h"

#include
#include
using namespace std;

bool IsSpace(char c)
{
if (' ' == c || '\t' == c)
return true;
return false;
}

bool IsCommentChar(char c)
{
switch(c) {
case COMMENT_CHAR:
return true;
default:
return false;
}
}

void Trim(string & str)
{
if (str.empty()) {
return;
}
int i, start_pos, end_pos;
for (i = 0; i < str.size(); ++i) {
if (!IsSpace(str[i])) {
break;
}
}
if (i == str.size()) { // 全部是空白字符串
str = "";
return;
}

start_pos = i;

for (i = str.size() - 1; i >= 0; --i) {
if (!IsSpace(str[i])) {
break;
}
}
end_pos = i;

str = str.substr(start_pos, end_pos - start_pos + 1);
}

bool AnalyseLine(const string & line, string & key, string & value)
{
if (line.empty())
return false;
int start_pos = 0, end_pos = line.size() - 1, pos;
if ((pos = line.find(COMMENT_CHAR)) != -1) {
if (0 == pos) { // 行的第一个字符就是注释字符
return false;
}
end_pos = pos - 1;
}
string new_line = line.substr(start_pos, start_pos + 1 - end_pos); // 预处理,删除注释部分

if ((pos = new_line.find('=')) == -1)
return false; // 没有=号

key = new_line.substr(0, pos);
value = new_line.substr(pos + 1, end_pos + 1- (pos + 1));

Trim(key);
if (key.empty()) {
return false;
}
Trim(value);
return true;
}

bool ReadConfig(const string & filename, map<string, string> & m)
{
m.clear();
ifstream infile(filename.c_str());
if (!infile) {
cout << "file open error" << endl;
return false;
}
string line, key, value;
while (getline(infile, line)) {
if (AnalyseLine(line, key, value)) {
m[key] = value;
}
}

infile.close();
return true;
}

void PrintConfig(const map<string, string> & m)
{
map<string, string>::const_iterator mite = m.begin();
for (; mite != m.end(); ++mite) {
cout << mite->first << "=" << mite->second << endl;
}
}
复制代码



测试数据:test.cfg

#added by jasit

 key1 = value1

key2  =  value2 

  

  key3 = value3 + value3

  sdf

  

测试源程序:test.cpp

#include "get_config.h"
 
int main()
{
    map m;
    ReadConfig("test2.cfg", m);
    PrintConfig(m);
     
    return 0;
}

  

makefile:

复制代码
BIN := test

CFLAGS := -g -static -Wall
CC := g++

SRCFILE := $(wildcard *.cpp)
OBJFILE := $(patsubst %.cpp,%.o,$(SRCFILE))

$(BIN): $(OBJFILE)
$(CC) $(CFLAGS) -o $(BIN) $(OBJFILE)

%.o:%.cpp
$(CC) $(CFLAGS) -c $< -o $@



clean :
rm -rf $(OBJFILE) ${BIN}
复制代码
阅读(1158) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~