Ratel 網(wǎng)絡(luò)庫(kù)之配置文件模塊設(shè)計(jì)思路
作者:CallMeEngineer
配置文件讀取應(yīng)該在程序的開(kāi)始進(jìn)行初始化,從配置文件中讀取程序的相關(guān)配置和用戶(hù)自定義的信息。如:程序的進(jìn)程的啟動(dòng)個(gè)數(shù)、每個(gè)進(jìn)程應(yīng)該啟動(dòng)的線(xiàn)程數(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類(lèi)):
- 配置文件讀取應(yīng)該在程序的開(kāi)始進(jìn)行初始化,從配置文件中讀取程序的相關(guān)配置和用戶(hù)自定義的信息。如:程序的進(jìn)程的啟動(dòng)個(gè)數(shù)、每個(gè)進(jìn)程應(yīng)該啟動(dòng)的線(xiàn)程數(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)行干擾
配置類(lèi)的運(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)源:
暢游碼海