Chinaunix首页 | 论坛 | 博客
  • 博客访问: 32102
  • 博文数量: 32
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 205
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-14 09:52
文章分类

全部博文(32)

文章存档

2017年(15)

2016年(17)

我的朋友

分类: C/C++

2017-03-09 13:20:57

在项目中经常会用到一些配置文件,在Windows下其后缀是.ini。例如:端口配置.ini
配置文件由节、键、值组成。


[section]
键=值
name=value

下面主要用C来实现在Linux下获取配置文件中键的值:

如配置文件为sysconfig,在Linux下一般配置文件放在对应的/etc目录下

//sysconfig文件信息

[cpp] view plain copy
  1. [Config1]  
  2. PORT=8080  
  3. #HOSTIP=192.168.1.1  
  4. HOSTIP=192.168.1.2  
  5. SENDIP=192.168.1.3  
  6.   
  7.    
  8.   
  9. [Config2]  
  10. PORT=5050  
  11. #HOSTIP=192.168.1.1  
  12. HOSTIP=192.122.16.19  
  13. SENDIP=192.122.16.19  
  14.   
  15. [Config3]  
  16. PORT=1666  
  17. #HOSTIP=192.168.1.1  
  18. HOSTIP=192.168.12.2  
  19. SENDIP=192.168.12.3  


 

//config.h

[cpp] view plain copy
  1. /*************************************************************      
  2.     FileName : config.h  
  3.     FileFunc : 定义头文件     
  4.     Version  : V0.1      
  5.     Author   : Sunrier      
  6.     Date     : 2012-05-09  
  7.     Descp    : Linux下获取配置文件信息      
  8. *************************************************************/  
  9. #ifndef   _CONFIG_H  
  10. #define   _CONFIG_H  
  11.   
  12. #ifdef __cplusplus  
  13. extern "C" {  
  14. #endif  
  15.   
  16. #define  SUCCESS           0x00 /*成功*/  
  17. #define  FAILURE           0x01 /*失败*/  
  18.   
  19. #define  FILENAME_NOTEXIST      0x02 /*配置文件名不存在*/  
  20. #define  SECTIONNAME_NOTEXIST    0x03 /*节名不存在*/  
  21. #define  KEYNAME_NOTEXIST      0x04 /*键名不存在*/  
  22. #define  STRING_LENNOTEQUAL     0x05 /*两个字符串长度不同*/  
  23. #define  STRING_NOTEQUAL       0x06 /*两个字符串内容不相同*/  
  24. #define  STRING_EQUAL        0x00 /*两个字符串内容相同*/  
  25.   
  26.   
  27. int CompareString(char *pInStr1,char *pInStr2);  
  28. int GetKeyValue(FILE *fpConfig,char *pInKeyName,char *pOutKeyValue);  
  29. int GetConfigIntValue(char *pInFileName,char *pInSectionName,char *pInKeyName,int *pOutKeyValue);  
  30. int GetConfigStringValue(char *pInFileName,char *pInSectionName,char *pInKeyName,char *pOutKeyValue);  
  31.   
  32. #ifdef __cplusplus  
  33. }  
  34. #endif  
  35.   
  36. #endif  


 

//config.c

[cpp] view plain copy
  1. /*************************************************************      
  2.     FileName : config.c  
  3.     FileFunc : 定义实现文件     
  4.     Version  : V0.1      
  5.     Author   : Sunrier      
  6.     Date     : 2012-05-09  
  7.     Descp    : Linux下获取配置文件信息     
  8. *************************************************************/  
  9. #include   
  10. #include   
  11. #include   
  12. #include "config.h"  
  13.   
  14. int GetConfigStringValue(char *pInFileName,char *pInSectionName,char *pInKeyName,char *pOutKeyValue)  
  15. {  
  16.     FILE *fpConfig;  
  17.     char szBuffer[150];  
  18.     char *pStr1,*pStr2;  
  19.     int iRetCode = 0;  
  20.       
  21.     /*test*/  
  22.     /* 
  23.     printf("pInFileName: %s !\n",pInFileName); 
  24.     printf("pInSectionName: %s !\n",pInSectionName); 
  25.     printf("pInKeyName: %s !\n",pInKeyName); 
  26.     */  
  27.       
  28.     memset(szBuffer,0,sizeof(szBuffer));  
  29.     if( NULL==( fpConfig=fopen(pInFileName,"r") ) )  
  30.         return FILENAME_NOTEXIST;  
  31.           
  32.     while( !feof(fpConfig) )  
  33.     {  
  34.         if( NULL==fgets(szBuffer,150,fpConfig) )  
  35.             break;  
  36.         pStr1 = szBuffer ;    
  37.         while( (' '==*pStr1) || ('\t'==*pStr1) )  
  38.             pStr1++;  
  39.         if'['==*pStr1 )  
  40.         {  
  41.             pStr1++;  
  42.             while( (' '==*pStr1) || ('\t'==*pStr1) )  
  43.                 pStr1++;  
  44.             pStr2 = pStr1;  
  45.             while( (']'!=*pStr1) && ('\0'!=*pStr1) )  
  46.                 pStr1++;  
  47.             if'\0'==*pStr1)     
  48.                 continue;  
  49.             while' '==*(pStr1-1) )  
  50.                 pStr1--;      
  51.             *pStr1 = '\0';  
  52.                       
  53.             iRetCode = CompareString(pStr2,pInSectionName);   
  54.             if( !iRetCode )/*检查节名*/  
  55.             {  
  56.                 iRetCode = GetKeyValue(fpConfig,pInKeyName,pOutKeyValue);  
  57.                 fclose(fpConfig);  
  58.                 return iRetCode;  
  59.             }     
  60.         }                     
  61.     }  
  62.       
  63.     fclose(fpConfig);  
  64.     return SECTIONNAME_NOTEXIST;  
  65.       
  66. }     
  67.   
  68. /*区分大小写*/  
  69. int CompareString(char *pInStr1,char *pInStr2)  
  70. {  
  71.     if( strlen(pInStr1)!=strlen(pInStr2) )  
  72.     {  
  73.         return STRING_LENNOTEQUAL;  
  74.     }     
  75.           
  76.     /*while( toupper(*pInStr1)==toupper(*pInStr2) )*//*#include */  
  77.     while( *pInStr1==*pInStr2 )  
  78.     {  
  79.         if'\0'==*pInStr1 )  
  80.             break;    
  81.         pInStr1++;  
  82.         pInStr2++;    
  83.     }  
  84.       
  85.     if'\0'==*pInStr1 )  
  86.         return STRING_EQUAL;  
  87.           
  88.     return STRING_NOTEQUAL;   
  89.       
  90. }  
  91.   
  92. int GetKeyValue(FILE *fpConfig,char *pInKeyName,char *pOutKeyValue)  
  93. {  
  94.     char szBuffer[150];  
  95.     char *pStr1,*pStr2,*pStr3;  
  96.     unsigned int uiLen;  
  97.     int iRetCode = 0;  
  98.       
  99.     memset(szBuffer,0,sizeof(szBuffer));      
  100.     while( !feof(fpConfig) )  
  101.     {     
  102.         if( NULL==fgets(szBuffer,150,fpConfig) )  
  103.             break;  
  104.         pStr1 = szBuffer;     
  105.         while( (' '==*pStr1) || ('\t'==*pStr1) )  
  106.             pStr1++;  
  107.         if'#'==*pStr1 )     
  108.             continue;  
  109.         if( ('/'==*pStr1)&&('/'==*(pStr1+1)) )    
  110.             continue;     
  111.         if( ('\0'==*pStr1)||(0x0d==*pStr1)||(0x0a==*pStr1) )      
  112.             continue;     
  113.         if'['==*pStr1 )  
  114.         {  
  115.             pStr2 = pStr1;  
  116.             while( (']'!=*pStr1)&&('\0'!=*pStr1) )  
  117.                 pStr1++;  
  118.             if']'==*pStr1 )  
  119.                 break;  
  120.             pStr1 = pStr2;    
  121.         }     
  122.         pStr2 = pStr1;  
  123.         while( ('='!=*pStr1)&&('\0'!=*pStr1) )  
  124.             pStr1++;  
  125.         if'\0'==*pStr1 )    
  126.             continue;  
  127.         pStr3 = pStr1+1;  
  128.         if( pStr2==pStr1 )  
  129.             continue;     
  130.         *pStr1 = '\0';  
  131.         pStr1--;  
  132.         while( (' '==*pStr1)||('\t'==*pStr1) )  
  133.         {  
  134.             *pStr1 = '\0';  
  135.             pStr1--;  
  136.         }  
  137.           
  138.         iRetCode = CompareString(pStr2,pInKeyName);  
  139.         if( !iRetCode )/*检查键名*/  
  140.         {  
  141.             pStr1 = pStr3;  
  142.             while( (' '==*pStr1)||('\t'==*pStr1) )  
  143.                 pStr1++;  
  144.             pStr3 = pStr1;  
  145.             while( ('\0'!=*pStr1)&&(0x0d!=*pStr1)&&(0x0a!=*pStr1) )  
  146.             {  
  147.                 if( ('/'==*pStr1)&&('/'==*(pStr1+1)) )  
  148.                     break;  
  149.                 pStr1++;      
  150.             }     
  151.             *pStr1 = '\0';  
  152.             uiLen = strlen(pStr3);  
  153.             memcpy(pOutKeyValue,pStr3,uiLen);  
  154.             *(pOutKeyValue+uiLen) = '\0';  
  155.             return SUCCESS;  
  156.         }  
  157.     }  
  158.       
  159.     return KEYNAME_NOTEXIST;  
  160. }  
  161.   
  162. int GetConfigIntValue(char *pInFileName,char *pInSectionName,char *pInKeyName,int *pOutKeyValue)  
  163. {  
  164.     int iRetCode = 0;  
  165.     char szKeyValue[16],*pStr;  
  166.       
  167.     memset(szKeyValue,0,sizeof(szKeyValue));  
  168.     iRetCode = GetConfigStringValue(pInFileName,pInSectionName,pInKeyName,szKeyValue);  
  169.     if( iRetCode )  
  170.         return iRetCode;  
  171.     pStr    = szKeyValue;  
  172.     while( (' '==*pStr)||('\t'==*pStr))  
  173.         pStr++;  
  174.     if( ('0'==*pStr)&&( ('x'==*(pStr+1))||('X'==*(pStr+1)) ) )    
  175.         sscanf(pStr+2,"%x",pOutKeyValue);  
  176.     else  
  177.         sscanf(pStr,"%d",pOutKeyValue);  
  178.           
  179.     return SUCCESS;   
  180.               
  181. }  


 

//测试实现功能test.c

[cpp] view plain copy
  1. /*************************************************************      
  2.     FileName : test.c  
  3.     FileFunc : 定义测试功能文件     
  4.     Version  : V0.1      
  5.     Author   : Sunrier      
  6.     Date     : 2012-05-09  
  7.     Descp    : Linux下获取配置文件信息      
  8. *************************************************************/  
  9. #include   
  10. #include   
  11. #include   
  12. #include "config.h"  
  13.   
  14. int main (int argc,char *argv[])  
  15. {  
  16.     char szFileName[100];/*配置文件名*/  
  17.     char szSectionName[100];/*节名*/  
  18.     char szKeyName[100];/*键名*/    
  19.     char szKeyValue[100];/*键值*/   
  20.     int iRetCode = 0;  
  21.     int iPort = -1;  
  22.     char szHostIp[30];  
  23.       
  24.     memset(szFileName,0,sizeof(szFileName));  
  25.     sprintf(szFileName,"%s/etc/sysconfig",getenv("HOME"));  
  26.     memset(szSectionName,0,sizeof(szSectionName));  
  27.     memcpy(szSectionName,argv[1],sizeof(argv[1]));  
  28.     memset(szKeyName,0,sizeof(szKeyName));  
  29.     memcpy(szKeyName,argv[2],sizeof(argv[2]));  
  30.     memset(szKeyValue,0,sizeof(szKeyValue));  
  31.     memset(szHostIp,0,sizeof(szHostIp));  
  32.       
  33.     iRetCode = GetConfigStringValue(szFileName,argv[1],argv[2],szHostIp);  
  34.     if( iRetCode )  
  35.     {  
  36.         printf("iRetCode : %d !\n",iRetCode );  
  37.     }  
  38.     else  
  39.     {  
  40.         printf("HOSTIP: %s\n",szHostIp);  
  41.     }  
  42.       
  43.     iRetCode = GetConfigIntValue(szFileName,"Config1","PORT",&iPort);  
  44.     if( iRetCode )  
  45.     {  
  46.         printf("iRetCode : %d !\n",iRetCode );  
  47.     }  
  48.     else  
  49.     {  
  50.         printf("PORT: %d\n",iPort);  
  51.     }  
  52.       
  53.     return 0;  
  54. }  


 

写一个makefile文件

//makefile

[cpp] view plain copy
  1. #makefile开始   
  2. all:Manager  
  3.   
  4. #定义宏  
  5. OBJS = test.o config.o   
  6.   
  7. #which compiler  
  8. CC = gcc  
  9.   
  10. #where are include files kept  
  11. INCLUDE = .  
  12.   
  13. #Options -O for release and -g for development  
  14. #-Wall:输出所有的警告信息  
  15. #-O:在编译时进行优化  
  16. #-g:表示编译debug版本  
  17. CFLAGS = -g -Wall -ansi   
  18. #CFLAGS = -O -Wall -ansi  
  19.   
  20. #前面加@不回显执行的命令在标准输出上  
  21. Manager:$(OBJS)  
  22.     @$(CC)  -o Manager $(OBJS)  
  23. #gcc test.o config.o -o Manager  
  24. test.o:test.c config.h  
  25.     @$(CC) -I$(INCLUDE) $(CFLAGS) -c test.c -o test.o  
  26. config.o:config.c config.h  
  27.     @$(CC) -I$(INCLUDE) $(CFLAGS) -c config.c -o config.o  
  28. clean :  
  29.     @rm -rf *.o  
  30. #makefile结束  


 

测试运行结果:

[Sunrier@localhost Sunrier]$ make
[Sunrier@localhost Sunrier]$ ./Manager Config1 HOSTIP
HOSTIP: 192.168.1.2
PORT: 8080
[Sunrier@localhost Sunrier]$

阅读(991) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~