歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 用C讀取INI配置文件

用C讀取INI配置文件

日期:2017/3/1 10:49:50   编辑:Linux編程
在Windows下可以用GetPrivateProfileString或GetPrivateProfileInt方便讀取.ini配置文件內容,但是在Linux平台上就一籌莫展了。為了解決該問題,打算用C來讀取.ini,即可不受平台的限制了。
  1. #define CONF_FILE_PATH "Config.ini"
  2. #include <string.h>
  3. #ifdef WIN32
  4. #include <Windows.h>
  5. #include <stdio.h>
  6. #else
  7. #define MAX_PATH 260
  8. #include <unistd.h>
  9. #include <fcntl.h>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <stdarg.h>
  13. #endif
  14. char g_szConfigPath[MAX_PATH];
  15. //獲取當前程序目錄
  16. int GetCurrentPath(char buf[],char *pFileName)
  17. {
  18. #ifdef WIN32
  19. GetModuleFileName(NULL,buf,MAX_PATH);
  20. #else
  21. char pidfile[64];
  22. int bytes;
  23. int fd;
  24. sprintf(pidfile, "/proc/%d/cmdline", getpid());
  25. fd = open(pidfile, O_RDONLY, 0);
  26. bytes = read(fd, buf, 256);
  27. close(fd);
  28. buf[MAX_PATH] = '\0';
  29. #endif
  30. char * p = &buf[strlen(buf)];
  31. do
  32. {
  33. *p = '\0';
  34. p--;
  35. #ifdef WIN32
  36. } while( '\\' != *p );
  37. #else
  38. } while( '/' != *p );
  39. #endif
  40. p++;
  41. //配置文件目錄
  42. memcpy(p,pFileName,strlen(pFileName));
  43. return 0;
  44. }
  45. //從INI文件讀取字符串類型數據
  46. char *GetIniKeyString(char *title,char *key,char *filename)
  47. {
  48. FILE *fp;
  49. char szLine[1024];
  50. static char tmpstr[1024];
  51. int rtnval;
  52. int i = 0;
  53. int flag = 0;
  54. char *tmp;
  55. if((fp = fopen(filename, "r")) == NULL)
  56. {
  57. printf("have no such file \n");
  58. return "";
  59. }
  60. while(!feof(fp))
  61. {
  62. rtnval = fgetc(fp);
  63. if(rtnval == EOF)
  64. {
  65. break;
  66. }
  67. else
  68. {
  69. szLine[i++] = rtnval;
  70. }
  71. if(rtnval == '\n')
  72. {
  73. #ifndef WIN32
  74. i--;
  75. #endif
  76. szLine[--i] = '\0';
  77. i = 0;
  78. tmp = strchr(szLine, '=');
  79. if(( tmp != NULL )&&(flag == 1))
  80. {
  81. if(strstr(szLine,key)!=NULL)
  82. {
  83. //注釋行
  84. if ('#' == szLine[0])
  85. {
  86. }
  87. else if ( '\/' == szLine[0] && '\/' == szLine[1] )
  88. {
  89. }
  90. else
  91. {
  92. //找打key對應變量
  93. strcpy(tmpstr,tmp+1);
  94. fclose(fp);
  95. return tmpstr;
  96. }
  97. }
  98. }
  99. else
  100. {
  101. strcpy(tmpstr,"[");
  102. strcat(tmpstr,title);
  103. strcat(tmpstr,"]");
  104. if( strncmp(tmpstr,szLine,strlen(tmpstr)) == 0 )
  105. {
  106. //找到title
  107. flag = 1;
  108. }
  109. }
  110. }
  111. }
  112. fclose(fp);
  113. return "";
  114. }
  115. //從INI文件讀取整類型數據
  116. int GetIniKeyInt(char *title,char *key,char *filename)
  117. {
  118. return atoi(GetIniKeyString(title,key,filename));
  119. }
  120. int main(int argc, char* argv[])
  121. {
  122. char buf[MAX_PATH];
  123. memset(buf,0,sizeof(buf));
  124. GetCurrentPath(buf,CONF_FILE_PATH);
  125. strcpy(g_szConfigPath,buf);
  126. int iCatAge;
  127. char szCatName[32];
  128. iCatAge = GetIniKeyInt("CAT","age",g_szConfigPath);
  129. strcpy(szCatName,GetIniKeyString("CAT","name",g_szConfigPath));
  130. return 0;
  131. }

下邊是配置文件:

[CAT]

age=2

name=Tom

Copyright © Linux教程網 All Rights Reserved