C++读取配置文件

来源:互联网 发布:dorado js怎么调试 编辑:程序博客网 时间:2024/05/16 07:12

C++读取配置文件

头文件:get_config.h

?
/****************************************************************************
*   作者:  jasitzhang(张涛)
*   日期:  2011-10-2
*   目的:  读取配置文件的信息,以map的形式存入
*   要求:  配置文件的格式,以#作为行注释,配置的形式是key = value,中间可有空格,也可没有空格
*****************************************************************************/
#ifndef _GET_CONFIG_H_
#define _GET_CONFIG_H_
  
#include <string>
#include <map>
usingnamespace std;
  
#define COMMENT_CHAR '#'
  
boolReadConfig(conststring & filename, map<string, string> & m);
voidPrintConfig(constmap<string, string> & m);
#endif

  

源文件:get_config.cpp

复制代码
#include "get_config.h"#include <fstream>#include <iostream>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<string, string> m;
    ReadConfig("test2.cfg", m);
    PrintConfig(m);
      
    return0;
}

  

makefile:

复制代码
BIN := test CFLAGS := -g -static -WallCC := 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}        
复制代码
原创粉丝点击