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

全部博文(34)

文章存档

2022年(2)

2017年(15)

2016年(17)

我的朋友

分类: C/C++

2017-03-02 17:55:33

  1. /*c语言实现,可在linux平台上用了,在Windows下可以用GetPrivateProfileString或GetPrivateProfileInt方便读取.ini配置文件内容,但是在Linux平台上就一筹莫展了。为了解决该问题,打算用C来读取.ini,即可不受平台的限制了*/  
  2. #define CONF_FILE_PATH  "Config.ini"  
  3. #include   
  4. #ifdef WIN32  
  5. #include   
  6. #include   
  7. #else  
  8. #define  MAX_PATH 260  
  9. #include   
  10. #include   
  11. #include   
  12. #include   
  13. #include   
  14. #endif  
  15. char g_szConfigPath[MAX_PATH];  
  16. //获取当前程序目录  
  17. int GetCurrentPath(char buf[],char *pFileName)  
  18. {  
  19. #ifdef WIN32  
  20.     GetModuleFileName(NULL,buf,MAX_PATH);   
  21. #else  
  22.     char pidfile[64];  
  23.     int bytes;  
  24.     int fd;  
  25.     sprintf(pidfile, "/proc/%d/cmdline", getpid());  
  26.   
  27.     fd = open(pidfile, O_RDONLY, 0);  
  28.     bytes = read(fd, buf, 256);  
  29.     close(fd);  
  30.     buf[MAX_PATH] = '\0';  
  31. #endif  
  32.     char * p = &buf[strlen(buf)];  
  33.     do   
  34.     {  
  35.         *p = '\0';  
  36.         p--;  
  37. #ifdef WIN32  
  38.     } while( '\\' != *p );  
  39. #else  
  40.     } while( '/' != *p );  
  41. #endif  
  42.     p++;  
  43.     //配置文件目录  
  44.     memcpy(p,pFileName,strlen(pFileName));  
  45.     return 0;  
  46. }  
  47.   
  48. //从INI文件读取字符串类型数据  
  49. char *GetIniKeyString(char *title,char *key,char *filename)   
  50. {   
  51.     FILE *fp;   
  52.     char szLine[1024];  
  53.     static char tmpstr[1024];  
  54.     int rtnval;  
  55.     int i = 0;   
  56.     int flag = 0;   
  57.     char *tmp;  
  58.   
  59.     if((fp = fopen(filename, "r")) == NULL)   
  60.     {   
  61.         printf("have   no   such   file \n");  
  62.         return "";   
  63.     }  
  64.     while(!feof(fp))   
  65.     {   
  66.         rtnval = fgetc(fp);   
  67.         if(rtnval == EOF)   
  68.         {   
  69.             break;   
  70.         }   
  71.         else   
  72.         {   
  73.             szLine[i++] = rtnval;   
  74.         }   
  75.         if(rtnval == '\n')   
  76.         {   
  77. #ifndef WIN32  
  78.             i--;  
  79. #endif    
  80.             szLine[--i] = '\0';  
  81.             i = 0;   
  82.             tmp = strchr(szLine, '=');   
  83.   
  84.             if(( tmp != NULL )&&(flag == 1))   
  85.             {   
  86.                 if(strstr(szLine,key)!=NULL)   
  87.                 {   
  88.                     //注释行  
  89.                     if ('#' == szLine[0])  
  90.                     {  
  91.                     }  
  92.                     else if ( '/' == szLine[0] && '/' == szLine[1] )  
  93.                     {  
  94.                           
  95.                     }  
  96.                     else  
  97.                     {  
  98.                         //找打key对应变量  
  99.                         strcpy(tmpstr,tmp+1);   
  100.                         fclose(fp);  
  101.                         return tmpstr;   
  102.                     }  
  103.                 }   
  104.             }  
  105.             else   
  106.             {   
  107.                 strcpy(tmpstr,"[");   
  108.                 strcat(tmpstr,title);   
  109.                 strcat(tmpstr,"]");  
  110.                 if( strncmp(tmpstr,szLine,strlen(tmpstr)) == 0 )   
  111.                 {  
  112.                     //找到title  
  113.                     flag = 1;   
  114.                 }  
  115.             }  
  116.         }  
  117.     }  
  118.     fclose(fp);   
  119.     return "";   
  120. }  
  121.   
  122. //从INI文件读取整类型数据  
  123. int GetIniKeyInt(char *title,char *key,char *filename)  
  124. {  
  125.     return atoi(GetIniKeyString(title,key,filename));  
  126. }  
  127.   
  128. int main(int argc, char* argv[])  
  129. {  
  130.     char buf[MAX_PATH];  
  131.     memset(buf,0,sizeof(buf));  
  132.     GetCurrentPath(buf,CONF_FILE_PATH);  
  133.     strcpy(g_szConfigPath,buf);  
  134.   
  135.     int iCatAge;  
  136.     char szCatName[32];  
  137.       
  138.     iCatAge = GetIniKeyInt("CAT","age",g_szConfigPath);  
  139.     char *a = GetIniKeyString("CAT","name",g_szConfigPath);  
  140.     printf("%d\r\n",iCatAge);  
  141.     printf("%s\r\n",a);  
  142.   
  143.     return 0;  
  144. }  
阅读(3027) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~