首页 > 代码库 > 配置文件

配置文件

  一个工程项目中,通常会有一个整体的配置文件,比如设置项目日志文件存放地址,日志保留等级,模块存放地址等等。

  假设现在有一个配置文件如下:

1 #the processs output will be logged in logfile
2 logfile=mylog.log
3 
4 #The path where modules will locate
5 module_path=/home/guang/myproject/modules/
6 
7 #Which module to load. Each one a line.
8 module=search
9 module=save

     要得到配置文件里面设置的内容,需要对配置文件进行解析,其头文件config.h如下:

 1 #include <vector>
 2 using namespace std;
 3 
 4 
 5 #define CONF_FILE  "config.conf"
 6 
 7 typedef struct Config{
 8     char                 *log_file;
 9    char                  *module_path;
10    vector<char *>        modules;
11 }Config;
12 
13 
14 Config  *initConfig();
15 void      loadConfig(Config *conf);

  config.cpp如下:

 1 #include "config.h"
 2 //初始化结构体
 3 Config *initConfig()
 4 {
 5       Config *conf = (Config *)malloc(sizeof(Config)) ;
 6       
 7       conf->log_file = NULL;
 8       conf->log_level = 0;
 9       conf->module_path = NULL;  
10 } 
11 
12 
13 //从配置文件中提取配置信息
14 void loadConfig(Config *config)
15 {
16       FILE *fp = NULL;
17       if((fp = fopen(CONF_FILE, "r")) == NULL)
18       {
19                LOG(LEVEL_ERROR, "Can‘t open config file %s", CONF_FILE);
20       }    
21 
22      char buf[MAX_CONF_LEN];
23      linenum = 0;
24      char *line = NULL;
25      int argue = 0;
26      char **argv = NULL;
27      const char *err = NULL;
28       while(fgets(buf, MAX_CONF_LEN, fp) != NULL)
29      {
30           linenum++;
31           line = strim(buf);
32           //判断当前行是否是空行或者注释行
33           if(line[0] == # || line[0] == \0)
34                   continue;
35 
36           argv = strsplit(line, =, &argc, 1);   //按‘=‘进行分割
37       //如果分隔得到的字符串为2
38           if(argc == 2)
39           {
40                   if(strcasecmp(argv[0], "log_file") == 0) //strcasecmp是忽略大小写判断两个字符串是否一致
41                            config->log_file = strdup(argv[1]);  //strdup的作用是拷贝字符串,它会自己申请拷贝字符串大小的内存
42                  
43                  else if(strcasecmp(argv[0], "module_path") == 0)
44                           config->module_path = strdup(argv[1]);
45                  else if(strcasecmp(argv[0], "module") == 0)
46                          config->modules.push_back(strdup(argv[1]));
47           }
48           else {
49                 err = "directive must be ‘key=value‘";
50                 goto conferr;
51          }
52      }
53      return;
54 conferr:
55      LOG(LEVEL_ERR, "bad directive in %s[line: %d]  %s", CONF_FILE, linenum, err);
56 }        

 

配置文件