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

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

配置文件

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

配置类的运行思路:

CConfig

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

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

 

 

责任编辑:武晓燕 来源: 畅游码海
相关推荐

2010-02-03 09:19:31

Python模块

2011-03-02 13:12:37

vsftpd配置

2020-11-20 06:30:07

Pythonini配置文件编程语言

2020-04-09 13:23:29

Nginx配置文件模板

2010-05-31 11:10:37

Nagios pnp

2013-08-20 15:31:18

前端模块化

2010-06-17 21:34:05

2011-03-04 13:58:41

2011-01-19 14:00:21

2011-03-04 14:01:48

VSFTPD.CONF

2011-03-04 14:04:43

2011-01-13 16:27:26

Linux配置文件

2018-08-08 10:10:54

Windows 10Windows网络配置

2010-12-28 16:35:32

Outlook 配置文

2010-12-27 14:59:31

Outlook 配置文

2011-03-28 09:07:26

Nagios配置文件

2011-03-28 15:52:16

Nagios配置文件

2011-04-01 16:30:49

Nagios

2009-07-09 15:55:18

WebWork配置文件

2011-03-03 09:14:38

PureFTPd
点赞
收藏

51CTO技术栈公众号