Ratel 網絡庫之配置文件模塊設計思路
作者:CallMeEngineer
配置文件讀取應該在程序的開始進行初始化,從配置文件中讀取程序的相關配置和用戶自定義的信息。如:程序的進程的啟動個數、每個進程應該啟動的線程數的個數、程序在Linux中是否以守護進程方式進行啟動等。
本文轉載自微信公眾號「暢游碼海」,作者CallMeEngineer 。轉載本文請聯系暢游碼海公眾號。
- 配置文件讀取思路(CConfig類):
- 配置文件讀取應該在程序的開始進行初始化,從配置文件中讀取程序的相關配置和用戶自定義的信息。如:程序的進程的啟動個數、每個進程應該啟動的線程數的個數、程序在Linux中是否以守護進程方式進行啟動等。配置文件的設計應該具有美觀、整潔等特點。
配置文件
- 以 '#' 開始的每一行配置應該當作提示內容,在讀取時應該直接跳過
- 當讀取到 “[” 符號時,應該進行跳過方便我們對配置文件的分組
- 其次應該注意到對空格的過濾,防止空格對我們讀取進行干擾
配置類的運行思路:
CConfig
代碼如下(含詳細注釋):
- /*
- *CConfig.h
- */
- #include<iostream>
- #include<map>
- class CConfig
- {
- public:
- //配置文件的路徑
- CConfig(std::string filename = "test.conf");
- ~CConfig(void);
- //初始化配置
- int InitConfig();
- //獲取配置參數
- std::string getParam(std::string param);
- //設置配置參數
- std::string setParam();
- private:
- bool file_isok; //文件是否讀取成功
- int ParamHandle(std::string strline); //處理每一行的參數
- public:
- std::map<std::string,std::string> paramstore; // 保存所有參數
- 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()){ //驗證文件是否可以打開,并進行標記
- 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 << "文件讀取出錯" << 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'){ //過濾空行
- start++;
- }else{
- break;
- }
- }
- for(end = strlen(str)-1; end > 0; end--){ //去掉末尾的空格和不可見字符
- 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 << "未讀取到任何參數" << std::endl;
- return -1;
- }
- return 0;
- }
- int CConfig::ParamHandle(std::string strline){ //跳過#開頭和'['開頭的組標記
- 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));
- }
責任編輯:武曉燕
來源:
暢游碼海