当前位置:首页 >休闲 >Ratel 网络库之配置文件模块设计思路 配置文作者CallMeEngineer

Ratel 网络库之配置文件模块设计思路 配置文作者CallMeEngineer

2024-06-30 17:16:53 [百科] 来源:避面尹邢网

Ratel 网络库之配置文件模块设计思路

作者:CallMeEngineer 网络 通信技术 配置文件读取应该在程序的络库路开始进行初始化,从配置文件中读取程序的配置文相关配置和用户自定义的信息。如:程序的模计思进程的启动个数、每个进程应该启动的块设线程数的个数、程序在Linux中是络库路否以守护进程方式进行启动等。 [[438245]]本文转载自微信公众号「畅游码海」,配置文作者CallMeEngineer 。模计思转载本文请联系畅游码海公众号。块设
  •  配置文件读取思路(CConfig类):
    • 配置文件读取应该在程序的络库路开始进行初始化,从配置文件中读取程序的配置文相关配置和用户自定义的信息。如:程序的模计思进程的启动个数、每个进程应该启动的块设线程数的个数、程序在Linux中是络库路否以守护进程方式进行启动等。配置文件的配置文设计应该具有美观、整洁等特点。模计思

配置文件

Ratel 网络库之配置文件模块设计思路 配置文作者CallMeEngineer

  • 以 '#' 开始的每一行配置应该当作提示内容,在读取时应该直接跳过
  • 当读取到 “[” 符号时,应该进行跳过方便我们对配置文件的分组
  • 其次应该注意到对空格的过滤,防止空格对我们读取进行干扰

配置类的运行思路:

Ratel 网络库之配置文件模块设计思路 配置文作者CallMeEngineer

CConfig

Ratel 网络库之配置文件模块设计思路 配置文作者CallMeEngineer

代码如下(含详细注释):

  1. /* 
  2.  *CConfig.h 
  3. */ 
  4. #include<iostream> 
  5. #include<map> 
  6. class CConfig 
  7. {  
  8. public: 
  9.  //配置文件的路径 
  10.  CConfig(std::string filename = "test.conf"); 
  11.  ~CConfig(void); 
  12.  //初始化配置 
  13.  int InitConfig(); 
  14.  //获取配置参数 
  15.  std::string getParam(std::string param); 
  16.  //设置配置参数 
  17.  std::string setParam(); 
  18. private: 
  19.   
  20.  bool file_isok; //文件是否读取成功 
  21.  int ParamHandle(std::string strline); //处理每一行的参数 
  22. public: 
  23.  std::map<std::string,std::string> paramstore; // 保存所有参数 
  24.  std::string filename; //文件名 
  25.   
  26. }; 
  1. /* 
  2.  * CConfig.cpp 
  3. */ 
  4. #include "stdafx.h" 
  5. #include "Config.h" 
  6. #include<fstream> 
  7. #include <string> 
  8. #include<cstring> 
  9. CConfig::CConfig(std::string filename):file_isok(false) 
  10. {  
  11.  std::ifstream fp; 
  12.  fp.open(filename.c_str(),std::ios::in); 
  13.  if(fp.is_open()){                       //验证文件是否可以打开,并进行标记 
  14.   file_isok = true; 
  15.   this->filename = filename; 
  16.  } 
  17.  
  18. CConfig::~CConfig(void) 
  19. {  
  20. std::string CConfig::getParam(std::string param){  
  21.  for(auto pa : paramstore){  
  22.   if(pa.first == param) 
  23.    return pa.second; 
  24.  } 
  25.  return ""; 
  26. int CConfig::InitConfig(){  
  27.  if(!file_isok)return -1; //初始化失败 
  28.  std::ifstream fp; 
  29.  fp.open(filename.c_str(), std::ifstream::in); 
  30.  if(!fp){  
  31.   std::cerr << "文件读取出错" << std::endl; 
  32.   return -1; 
  33.  } 
  34.  
  35.  char str[100]; 
  36.  while(fp.getline(str,100)){     //读取每一行的配置文件 
  37.   unsigned int start, end; 
  38.   for(start = 0; start < strlen(str); start++){  
  39.    if(str[start] == ' '|| str[start] == '\r' || str[start] == '\n'){  //过滤空行 
  40.     start++; 
  41.    }else{  
  42.     break; 
  43.    } 
  44.   } 
  45.   for(end = strlen(str)-1; end > 0; end--){    //去掉末尾的空格和不可见字符 
  46.    if(str[end] == ' '|| str[end] == '\r' || str[end] == '\n'){  
  47.     end--; 
  48.    }else{  
  49.     break; 
  50.    } 
  51.   } 
  52.   if(start<end){  
  53.    std::string strs(str, start, end-start + 2); 
  54.    ParamHandle(strs); 
  55.   } 
  56.  
  57.  
  58.  } 
  59.  if(paramstore.size() == 0){  
  60.   std::cerr << "未读取到任何参数" << std::endl; 
  61.   return -1; 
  62.  } 
  63.  return 0; 
  64. int CConfig::ParamHandle(std::string strline){  //跳过#开头和'['开头的组标记 
  65.  if(strline.empty())return -1; 
  66.  int flageq = 0; 
  67.  for(int i = 0; i < strline.size(); i++){  
  68.   if(strline[0] =='#' || strline[0] == '[') return 0; 
  69.   if(strline[i] == '='){  
  70.     flageq = i; 
  71.     break; 
  72.   } 
  73.  } 
  74.  std::string key(strline, 0, flageq); 
  75.  std::string value(strline, flageq + 1, strline.size() - flageq); 
  76.  paramstore.insert(std::make_pair(key, value)); 

 

 

责任编辑:武晓燕 来源: 畅游码海 网络库Ratel设计

(责任编辑:百科)

    推荐文章
    热点阅读