C语言读取类unix风格配置文件

 

C语言读取类unix风格配置文件

  380人阅读  评论(0)  收藏  举报

[c-sharp]  view plain copy
  1. /*************************************************** 
  2.  *                                     
  3.  *            C语言读取配置文件                    
  4.  *            陈志中  2010-1-17                    
  5.  *        chenzhizhong2007@gmail.com  
  6.  *                                                 
  7.  * 1、 通过 char *GetParamValue(char *cpConfFile,  
  8.  *                  char *cpParam, char *cpValue)  
  9.  *     函数获取指定配置文件中的指定参数的值,保存  
  10.  *     在cpValue中                                 
  11.  * 2、 配置文件风格说明:                          
  12.  *     (1) 自动忽略掉每行开头的空格                
  13.  *     (2) 以 # 开头的行是注释行                   
  14.  *     (3) 不能以 = 开头                           
  15.  *     (4) 支持行末注释                            
  16. ***************************************************/  
  17.  
  18.  
  19. #include <stdio.h>  
  20. #include <stdlib.h>  
  21. #include <string.h>  
  22.   
  23. /*获取指定文件中最长的行的长度*/  
  24. static unsigned long GetMaxLineLen(char *cpFileName)  
  25. {  
  26.     FILE *fpFile = NULL;  
  27.     unsigned long ulMaxLineLen = 0;  
  28.     unsigned long ulCntLineLen = 0;  
  29.     char cCh = EOF;  
  30.       
  31.     /*打开文件*/  
  32.     fpFile = fopen(cpFileName, "r");  
  33.     if(NULL == fpFile)  
  34.     {  
  35.         return 0;  
  36.     }  
  37.       
  38.     /*逐行读取文件,遇到'/n'结束一行*/  
  39.     while(1)  
  40.     {  
  41.         cCh = fgetc(fpFile);  
  42.         if(EOF == cCh)  
  43.         {  
  44.             if(ulCntLineLen > ulMaxLineLen)  
  45.             {  
  46.                 ulMaxLineLen = ulCntLineLen;  
  47.                 ulCntLineLen = 0;  
  48.             }  
  49.             break;  
  50.         }  
  51.         ulCntLineLen++;  
  52.         if('/n' == cCh)  
  53.         {  
  54.             if(ulCntLineLen > ulMaxLineLen)  
  55.             {  
  56.                 ulMaxLineLen = ulCntLineLen;  
  57.                 ulCntLineLen = 0;  
  58.             }  
  59.             ulCntLineLen = 0;  
  60.         }  
  61.     }  
  62.       
  63.     fclose(fpFile);  
  64.       
  65.     return ulMaxLineLen;  
  66. }  
  67.   
  68. /*去掉字符串开头的空白字符,并返回指针*/  
  69. static char *TrimLeft(char *cpString)  
  70. {  
  71.     char *cpRet = NULL;  
  72.       
  73.     /*过滤空字符串*/  
  74.     if('/0' == *cpString)  
  75.     {  
  76.         return cpString;  
  77.     }  
  78.       
  79.     /*忽略头部的 空格 '/r' '/n' '/t'*/  
  80.     cpRet = cpString;  
  81.     while(' ' == *cpRet || '/t' == *cpRet || '/r' == *cpRet || '/n' == *cpRet)  
  82.     {  
  83.         cpRet++;  
  84.     }  
  85.       
  86.     return cpRet;  
  87. }  
  88.   
  89. /*去掉字符串末尾的空白字符*/  
  90. static void TrimRight(char *cpString)  
  91. {  
  92.     unsigned long ulStrLen = 0;  
  93.       
  94.     /*过滤空字符串*/  
  95.     if('/0' == *cpString)  
  96.     {  
  97.         return;  
  98.     }  
  99.       
  100.     /*去掉尾部的 空格 '/r' '/n' '/t'*/  
  101.     ulStrLen = strlen(cpString);      
  102.     while(' ' == cpString[ulStrLen - 1] || '/t' == cpString[ulStrLen - 1]   
  103.           || '/r' == cpString[ulStrLen - 1] || '/n' == cpString[ulStrLen - 1])  
  104.     {  
  105.         ulStrLen--;  
  106.     }  
  107.     cpString[ulStrLen] = '/0';  
  108. }  
  109.   
  110. /*去掉字符串开头和末尾的空白字符*/  
  111. static char *TrimStr(char *cpString)  
  112. {  
  113.     char *cpRet = NULL;  
  114.       
  115.     TrimRight(cpString);  
  116.     cpRet = TrimLeft(cpString);  
  117.       
  118.     return cpRet;  
  119. }  
  120.   
  121. /*从给定行字符串中解析出指定参数名的参数值*/  
  122. static char *ParseLine(char *cpLine, char *cpParam, char *cpValue)  
  123. {  
  124.     char *cpTmp = NULL;  
  125.     char *cpPtr = NULL;  
  126.     unsigned long ulSepLoc = 0;  
  127.       
  128.     /*去掉行首的空格*/  
  129.     cpTmp = TrimLeft(cpLine);  
  130.       
  131.     /*过滤注释行,即以 # 开头的行, 第一个字符不可以是 = */  
  132.     if('#' == *cpTmp || '=' == *cpTmp)  
  133.     {  
  134.         return NULL;  
  135.     }  
  136.       
  137.     /*查找 # 号,移除行末注释*/  
  138.     ulSepLoc = 0;  
  139.     while(ulSepLoc < strlen(cpTmp))  
  140.     {  
  141.         if('#' == cpTmp[ulSepLoc])  
  142.         {  
  143.             break;  
  144.         }  
  145.         ulSepLoc++;  
  146.     }  
  147.     cpTmp[ulSepLoc] = '/0';  
  148.       
  149.     /*查找 = */  
  150.     ulSepLoc = 0;  
  151.     while(ulSepLoc < strlen(cpTmp))  
  152.     {  
  153.         if('=' == cpTmp[ulSepLoc])  
  154.         {  
  155.             break;  
  156.         }  
  157.         ulSepLoc++;  
  158.     }  
  159.     if(ulSepLoc == strlen(cpTmp))  
  160.     {  
  161.         return NULL;  
  162.     }  
  163.       
  164.     /*获取参数*/  
  165.     cpTmp[ulSepLoc] = '/0';   
  166.     cpPtr = TrimStr(cpTmp);  
  167.     if(strcmp(cpPtr, cpParam))  
  168.     {  
  169.         return NULL;  
  170.     }  
  171.       
  172.     /*获取参数的值*/  
  173.     cpPtr = TrimStr(cpTmp + ulSepLoc + 1);  
  174.     strcpy(cpValue, cpPtr);  
  175.       
  176.     return cpValue;  
  177. }  
  178.   
  179. /*从指定配置文件中获取指定参数名的参数值*/  
  180. char *GetParamValue(char *cpConfFile, char *cpParam, char *cpValue)  
  181. {  
  182.     FILE *fpConf = NULL;  
  183.     char *cpLine = NULL;  
  184.     char *cpRet  = NULL;  
  185.     char cCh     = EOF;  
  186.     unsigned long ulMaxLineLen = 0;  
  187.     unsigned long ulLineLen    = 0;  
  188.       
  189.     /*获取最大行长度*/  
  190.     ulMaxLineLen = GetMaxLineLen(cpConfFile);  
  191.     if(0 == ulMaxLineLen)  
  192.     {  
  193.         return NULL;  
  194.     }  
  195.       
  196.     /*打开文件*/  
  197.     fpConf = fopen(cpConfFile, "r");  
  198.     if(NULL == fpConf)  
  199.     {  
  200.         return NULL;  
  201.     }  
  202.       
  203.     /*分配内存*/  
  204.     cpLine = (char *)malloc(ulMaxLineLen + 1);  
  205.     if(NULL == cpLine)  
  206.     {  
  207.         fclose(fpConf);  
  208.         return NULL;  
  209.     }  
  210.       
  211.     /*逐行读取并分析*/  
  212.     ulLineLen = 0;  
  213.     while(1)  
  214.     {  
  215.         cCh = fgetc(fpConf);  
  216.         switch(cCh)  
  217.         {  
  218.             case '/n':  
  219.             cpLine[ulLineLen++] = cCh;  
  220.             cpLine[ulLineLen++] = '/0';  
  221.             if(NULL != (cpRet = ParseLine(cpLine, cpParam, cpValue)))  
  222.             {  
  223.                 break;  
  224.             }  
  225.             ulLineLen = 0;  
  226.             break;  
  227.               
  228.             case EOF:  
  229.             cpLine[ulLineLen++] = '/0';  
  230.             if(NULL != (cpRet = ParseLine(cpLine, cpParam, cpValue)))  
  231.             {  
  232.                 break;  
  233.             }  
  234.             ulLineLen = 0;  
  235.             break;  
  236.               
  237.             default:  
  238.             cpLine[ulLineLen++] = cCh;  
  239.             break;  
  240.         }  
  241.           
  242.         if(NULL != cpRet || EOF == cCh)  
  243.         {  
  244.             break;  
  245.         }  
  246.     }  
  247.       
  248.     /*释放内存、关闭文件*/  
  249.     free(cpLine);  
  250.     fclose(fpConf);  
  251.       
  252.     return cpRet;  
  253. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值