用C读取INI配置文件

用C读取INI配置文件

分类: C/C++ Linux Win32/VC   1169人阅读  评论(5)  收藏  举报

 

    在Windows下可以用GetPrivateProfileString或GetPrivateProfileInt方便读取.ini配置文件内容,但是在Linux平台上就一筹莫展了。为了解决该问题,打算用C来读取.ini,即可不受平台的限制了。

[cpp]  view plain copy
  1. #define CONF_FILE_PATH  "Config.ini"  
  2.   
  3. #include <string.h>  
  4.   
  5. #ifdef WIN32  
  6. #include <Windows.h>  
  7. #include <stdio.h>  
  8. #else  
  9.   
  10. #define  MAX_PATH 260  
  11.   
  12. #include <unistd.h>  
  13. #include <fcntl.h>  
  14. #include <stdio.h>  
  15. #include <stdlib.h>  
  16. #include <stdarg.h>  
  17. #endif  
  18.   
  19. char g_szConfigPath[MAX_PATH];  
  20.   
  21. //获取当前程序目录  
  22. int GetCurrentPath(char buf[],char *pFileName)  
  23. {  
  24. #ifdef WIN32  
  25.     GetModuleFileName(NULL,buf,MAX_PATH);   
  26. #else  
  27.     char pidfile[64];  
  28.     int bytes;  
  29.     int fd;  
  30.   
  31.     sprintf(pidfile, "/proc/%d/cmdline", getpid());  
  32.   
  33.     fd = open(pidfile, O_RDONLY, 0);  
  34.     bytes = read(fd, buf, 256);  
  35.     close(fd);  
  36.     buf[MAX_PATH] = '\0';  
  37.   
  38. #endif  
  39.     char * p = &buf[strlen(buf)];  
  40.     do   
  41.     {  
  42.         *p = '\0';  
  43.         p--;  
  44. #ifdef WIN32  
  45.     } while'\\' != *p );  
  46. #else  
  47.     } while'/' != *p );  
  48. #endif  
  49.   
  50.     p++;  
  51.   
  52.     //配置文件目录  
  53.     memcpy(p,pFileName,strlen(pFileName));  
  54.     return 0;  
  55. }  
  56.   
  57. //从INI文件读取字符串类型数据  
  58. char *GetIniKeyString(char *title,char *key,char *filename)   
  59. {   
  60.     FILE *fp;   
  61.     char szLine[1024];  
  62.     static char tmpstr[1024];  
  63.     int rtnval;  
  64.     int i = 0;   
  65.     int flag = 0;   
  66.     char *tmp;  
  67.   
  68.     if((fp = fopen(filename, "r")) == NULL)   
  69.     {   
  70.         printf("have   no   such   file \n");  
  71.         return "";   
  72.     }  
  73.     while(!feof(fp))   
  74.     {   
  75.         rtnval = fgetc(fp);   
  76.         if(rtnval == EOF)   
  77.         {   
  78.             break;   
  79.         }   
  80.         else   
  81.         {   
  82.             szLine[i++] = rtnval;   
  83.         }   
  84.         if(rtnval == '\n')   
  85.         {   
  86. #ifndef WIN32  
  87.             i--;  
  88. #endif    
  89.             szLine[--i] = '\0';  
  90.             i = 0;   
  91.             tmp = strchr(szLine, '=');   
  92.   
  93.             if(( tmp != NULL )&&(flag == 1))   
  94.             {   
  95.                 if(strstr(szLine,key)!=NULL)   
  96.                 {   
  97.                     //注释行  
  98.                     if ('#' == szLine[0])  
  99.                     {  
  100.                     }  
  101.                     else if ( '\/' == szLine[0] && '\/' == szLine[1] )  
  102.                     {  
  103.                           
  104.                     }  
  105.                     else  
  106.                     {  
  107.                         //找打key对应变量  
  108.                         strcpy(tmpstr,tmp+1);   
  109.                         fclose(fp);  
  110.                         return tmpstr;   
  111.                     }  
  112.                 }   
  113.             }  
  114.             else   
  115.             {   
  116.                 strcpy(tmpstr,"[");   
  117.                 strcat(tmpstr,title);   
  118.                 strcat(tmpstr,"]");  
  119.                 if( strncmp(tmpstr,szLine,strlen(tmpstr)) == 0 )   
  120.                 {  
  121.                     //找到title  
  122.                     flag = 1;   
  123.                 }  
  124.             }  
  125.         }  
  126.     }  
  127.     fclose(fp);   
  128.     return "";   
  129. }  
  130.   
  131. //从INI文件读取整类型数据  
  132. int GetIniKeyInt(char *title,char *key,char *filename)  
  133. {  
  134.     return atoi(GetIniKeyString(title,key,filename));  
  135. }  
  136.   
  137. int main(int argc, char* argv[])  
  138. {  
  139.     char buf[MAX_PATH];  
  140.     memset(buf,0,sizeof(buf));  
  141.     GetCurrentPath(buf,CONF_FILE_PATH);  
  142.     strcpy(g_szConfigPath,buf);  
  143.   
  144.     int iCatAge;  
  145.     char szCatName[32];  
  146.       
  147.     iCatAge = GetIniKeyInt("CAT","age",g_szConfigPath);  
  148.     strcpy(szCatName,GetIniKeyString("CAT","name",g_szConfigPath));  
  149.   
  150.     return 0;  
  151. }  


下边是配置文件:

[CAT]

age=2

name=Tom

纯c读写ini配置文件 用c/c++读写ini配置文件有不少第三方的开源库,如iniparser、libini、rwini、UltraLightINIParser等,但都不理想,往往代码较大、功能较弱、 接口使用不方便。尤其在大小写处理、前后空格、各种注释、跨平台换行符支持、带引号字符串处理、无section操作、原格式保持等方面存在问题。 现将本人精心制作的ini读写程序源码奉献给大家,纯c编写,简洁好用。支持windows和linux。 主要特点: 1、支持;和#注释符号,支持行尾注释。 2、支持带引号'或"成对匹配的字符串,提取时自动去引号。引号中可带其它引号或;#注释符。 3、支持无section或空section(名称为空)。 4、支持10、16、8进制数,0x开头为16进制数,0开头为8进制。 5、支持section、key或=号前后带空格。 6、支持\n、\r、\r\n或\n\r换行格式。 7、不区分section、key大小写,但写入时以新串为准,并保持其大小写。 8、新增数据时,若section存在则在该节最后一个有效数据后添加,否则在文件尾部添加。 9、支持指定key所在整行删除,即删除该键值,包括注释。 10、可自动跳过格式错误行,修改时仍然保留。 11、修改时保留原注释:包括整行注释、行尾注释(包括前面空格)。 12、修改时保留原空行。以上三点主要是尽量保留原格式。 不足之处: 1、不支持单key多value(逗号分割),只能一次性提取后自行处理。 2、不支持同名重复section和key。(重复section可视为错误,重复key则可能造成分歧) 3、不能提取所有section或key名称。 使用只需两个文件inirw.h、inirw.c,另有测试程序和工程文件,支持windows和linux。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值