C 读取ini文件

在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. }
#define CONF_FILE_PATH	"Config.ini"

#include <string.h>

#ifdef WIN32
#include <Windows.h>
#include <stdio.h>
#else

#define  MAX_PATH 260

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#endif

char g_szConfigPath[MAX_PATH];

//获取当前程序目录
int GetCurrentPath(char buf[],char *pFileName)
{
#ifdef WIN32
	GetModuleFileName(NULL,buf,MAX_PATH); 
#else
	char pidfile[64];
	int bytes;
	int fd;

	sprintf(pidfile, "/proc/%d/cmdline", getpid());

	fd = open(pidfile, O_RDONLY, 0);
	bytes = read(fd, buf, 256);
	close(fd);
	buf[MAX_PATH] = '\0';

#endif
	char * p = &buf[strlen(buf)];
	do 
	{
		*p = '\0';
		p--;
#ifdef WIN32
	} while( '\\' != *p );
#else
	} while( '/' != *p );
#endif

	p++;

	//配置文件目录
	memcpy(p,pFileName,strlen(pFileName));
	return 0;
}

//从INI文件读取字符串类型数据
char *GetIniKeyString(char *title,char *key,char *filename) 
{ 
	FILE *fp; 
	char szLine[1024];
	static char tmpstr[1024];
	int rtnval;
	int i = 0; 
	int flag = 0; 
	char *tmp;

	if((fp = fopen(filename, "r")) == NULL) 
	{ 
		printf("have   no   such   file \n");
		return ""; 
	}
	while(!feof(fp)) 
	{ 
		rtnval = fgetc(fp); 
		if(rtnval == EOF) 
		{ 
			break; 
		} 
		else 
		{ 
			szLine[i++] = rtnval; 
		} 
		if(rtnval == '\n') 
		{ 
#ifndef WIN32
			i--;
#endif	
			szLine[--i] = '\0';
			i = 0; 
			tmp = strchr(szLine, '='); 

			if(( tmp != NULL )&&(flag == 1)) 
			{ 
				if(strstr(szLine,key)!=NULL) 
				{ 
					//注释行
					if ('#' == szLine[0])
					{
					}
					else if ( '\/' == szLine[0] && '\/' == szLine[1] )
					{
						
					}
					else
					{
						//找打key对应变量
						strcpy(tmpstr,tmp+1); 
						fclose(fp);
						return tmpstr; 
					}
				} 
			}
			else 
			{ 
				strcpy(tmpstr,"["); 
				strcat(tmpstr,title); 
				strcat(tmpstr,"]");
				if( strncmp(tmpstr,szLine,strlen(tmpstr)) == 0 ) 
				{
					//找到title
					flag = 1; 
				}
			}
		}
	}
	fclose(fp); 
	return ""; 
}

//从INI文件读取整类型数据
int GetIniKeyInt(char *title,char *key,char *filename)
{
	return atoi(GetIniKeyString(title,key,filename));
}

int main(int argc, char* argv[])
{
	char buf[MAX_PATH];
	memset(buf,0,sizeof(buf));
	GetCurrentPath(buf,CONF_FILE_PATH);
	strcpy(g_szConfigPath,buf);

	int iCatAge;
	char szCatName[32];
	
	iCatAge = GetIniKeyInt("CAT","age",g_szConfigPath);
	strcpy(szCatName,GetIniKeyString("CAT","name",g_szConfigPath));

	return 0;
}


下边是配置文件:

[CAT]

age=2

name=Tom

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值