zoukankan      html  css  js  c++  java
  • C++读取配置文件

    头文件:get_config.h

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



  • 相关阅读:
    快速免费用宝塔面板加开源小程序商城源码搭建自己的商城程序
    小程序商城,到底是购买源码好还是直接使用SaaS平台好?
    51单片机串口通信的注记
    关于vi 分屏的一些指令
    偶遇bash 的while read line 的问题
    centos 6 设置无密码登录ssh 不成功问题
    关于js框架 dwz 与 yii的的分页 以及筛选的结合
    完美解决百度地图MarkerClusterer 移动地图时,Marker 的Label 丢失的问题
    微信小程序购物商城系统开发系列-目录结构
    微信小程序支付步骤
  • 原文地址:https://www.cnblogs.com/tzhangofseu/p/2197966.html
Copyright © 2011-2022 走看看