本文转载自微信公众号「畅游码海」,作者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));
- }