Ratel 網(wǎng)絡(luò)庫(kù)之配置文件模塊設(shè)計(jì)思路
作者:CallMeEngineer 
  配置文件讀取應(yīng)該在程序的開(kāi)始進(jìn)行初始化,從配置文件中讀取程序的相關(guān)配置和用戶自定義的信息。如:程序的進(jìn)程的啟動(dòng)個(gè)數(shù)、每個(gè)進(jìn)程應(yīng)該啟動(dòng)的線程數(shù)的個(gè)數(shù)、程序在Linux中是否以守護(hù)進(jìn)程方式進(jìn)行啟動(dòng)等。
 本文轉(zhuǎn)載自微信公眾號(hào)「暢游碼?!?,作者CallMeEngineer 。轉(zhuǎn)載本文請(qǐng)聯(lián)系暢游碼海公眾號(hào)。
-  配置文件讀取思路(CConfig類):
    
- 配置文件讀取應(yīng)該在程序的開(kāi)始進(jìn)行初始化,從配置文件中讀取程序的相關(guān)配置和用戶自定義的信息。如:程序的進(jìn)程的啟動(dòng)個(gè)數(shù)、每個(gè)進(jìn)程應(yīng)該啟動(dòng)的線程數(shù)的個(gè)數(shù)、程序在Linux中是否以守護(hù)進(jìn)程方式進(jìn)行啟動(dòng)等。配置文件的設(shè)計(jì)應(yīng)該具有美觀、整潔等特點(diǎn)。
 
 
配置文件
- 以 '#' 開(kāi)始的每一行配置應(yīng)該當(dāng)作提示內(nèi)容,在讀取時(shí)應(yīng)該直接跳過(guò)
 - 當(dāng)讀取到 “[” 符號(hào)時(shí),應(yīng)該進(jìn)行跳過(guò)方便我們對(duì)配置文件的分組
 - 其次應(yīng)該注意到對(duì)空格的過(guò)濾,防止空格對(duì)我們讀取進(jìn)行干擾
 
配置類的運(yùn)行思路:
CConfig
代碼如下(含詳細(xì)注釋):
- /*
 - *CConfig.h
 - */
 - #include<iostream>
 - #include<map>
 - class CConfig
 - {
 - public:
 - //配置文件的路徑
 - CConfig(std::string filename = "test.conf");
 - ~CConfig(void);
 - //初始化配置
 - int InitConfig();
 - //獲取配置參數(shù)
 - std::string getParam(std::string param);
 - //設(shè)置配置參數(shù)
 - std::string setParam();
 - private:
 - bool file_isok; //文件是否讀取成功
 - int ParamHandle(std::string strline); //處理每一行的參數(shù)
 - public:
 - std::map<std::string,std::string> paramstore; // 保存所有參數(shù)
 - std::string filename; //文件名
 - };
 
- /*
 - * CConfig.cpp
 - */
 - #include "stdafx.h"
 - #include "Config.h"
 - #include<fstream>
 - #include <string>
 - #include<cstring>
 - CConfig::CConfig(std::string filename):file_isok(false)
 - {
 - std::ifstream fp;
 - fp.open(filename.c_str(),std::ios::in);
 - if(fp.is_open()){ //驗(yàn)證文件是否可以打開(kāi),并進(jìn)行標(biāo)記
 - file_isok = true;
 - this->filename = filename;
 - }
 - }
 - CConfig::~CConfig(void)
 - {
 - }
 - std::string CConfig::getParam(std::string param){
 - for(auto pa : paramstore){
 - if(pa.first == param)
 - return pa.second;
 - }
 - return "";
 - }
 - int CConfig::InitConfig(){
 - if(!file_isok)return -1; //初始化失敗
 - std::ifstream fp;
 - fp.open(filename.c_str(), std::ifstream::in);
 - if(!fp){
 - std::cerr << "文件讀取出錯(cuò)" << std::endl;
 - return -1;
 - }
 - char str[100];
 - while(fp.getline(str,100)){ //讀取每一行的配置文件
 - unsigned int start, end;
 - for(start = 0; start < strlen(str); start++){
 - if(str[start] == ' '|| str[start] == '\r' || str[start] == '\n'){ //過(guò)濾空行
 - start++;
 - }else{
 - break;
 - }
 - }
 - for(end = strlen(str)-1; end > 0; end--){ //去掉末尾的空格和不可見(jiàn)字符
 - if(str[end] == ' '|| str[end] == '\r' || str[end] == '\n'){
 - end--;
 - }else{
 - break;
 - }
 - }
 - if(start<end){
 - std::string strs(str, start, end-start + 2);
 - ParamHandle(strs);
 - }
 - }
 - if(paramstore.size() == 0){
 - std::cerr << "未讀取到任何參數(shù)" << std::endl;
 - return -1;
 - }
 - return 0;
 - }
 - int CConfig::ParamHandle(std::string strline){ //跳過(guò)#開(kāi)頭和'['開(kāi)頭的組標(biāo)記
 - if(strline.empty())return -1;
 - int flageq = 0;
 - for(int i = 0; i < strline.size(); i++){
 - if(strline[0] =='#' || strline[0] == '[') return 0;
 - if(strline[i] == '='){
 - flageq = i;
 - break;
 - }
 - }
 - std::string key(strline, 0, flageq);
 - std::string value(strline, flageq + 1, strline.size() - flageq);
 - paramstore.insert(std::make_pair(key, value));
 - }
 
責(zé)任編輯:武曉燕 
                    來(lái)源:
                    暢游碼海
 
















 
 
 
 
 
 
 