用C语言读取配置文件

74 篇文章 0 订阅
57 篇文章 0 订阅

用C语言读取配置文件

/*** readcfg.c ***/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>
#include <errno.h>

#define KEYVALLEN 100

/* 删除左边的空格   */

static char * l_trim(char * szOutput, const char *szInput)
{
	assert(szInput != NULL);
	assert(szOutput != NULL);
	assert(szOutput != szInput);

	for(; *szInput != '\0' && isspace(*szInput); ++szInput)
	{
		;
	}

	return strcpy(szOutput, szInput);
}

/*  删除右边的空格  */

static char *r_trim(char *szOutput, const char *szInput)
{
	char *p = NULL;

	assert(szInput != NULL);
	assert(szOutput != NULL);
	assert(szOutput != szInput);
	strcpy(szOutput, szInput);

	for(p = szOutput + strlen(szOutput) - 1; p >= szOutput && isspace(*p); --p)
	{
		;
	}

	*(++p) = '\0';

	return szOutput;
}

/*   删除两边的空格   */

static char * a_trim(char * szOutput, const char * szInput)
{
	char *p = NULL;

	assert(szInput != NULL);
	assert(szOutput != NULL);

	l_trim(szOutput, szInput);

	for(p = szOutput + strlen(szOutput) - 1;p >= szOutput && isspace(*p); --p)
	{
		;
	}

	*(++p) = '\0';

	return szOutput;
}

int GetProfileString(char *profile, char *AppName, char *KeyName, char *KeyVal)
{
	char appname[32],keyname[32];
	char *buf,*c;
	char buf_i[KEYVALLEN], buf_o[KEYVALLEN];

	FILE *fp;
	int found=0; /* 1 AppName 2 KeyName */

	if( (fp=fopen( profile,"r" ))==NULL )
	{
		printf( "openfile [%s] error [%s]\n",profile,strerror(errno) );
		return(-1);
	}

	fseek( fp, 0, SEEK_SET );
	memset( appname, 0, sizeof(appname) );
	sprintf( appname,"[%s]", AppName );

	while( !feof(fp) && fgets( buf_i, KEYVALLEN, fp )!=NULL )
	{
		l_trim(buf_o, buf_i);

		if( strlen(buf_o) <= 0 )
			continue;

		buf = NULL;
		buf = buf_o;

		if( found == 0 )
		{
			if( buf[0] != '[' ) 
			{
				continue;
			} 
			else if ( strncmp(buf,appname,strlen(appname))==0 )
			{
				found = 1;
				continue;
			}
		} 
		else if( found == 1 )
		{
			if( buf[0] == '#' )
			{
				continue;
			} 
			else if ( buf[0] == '[' ) 
			{
				break;
			} 
			else 
			{
				if( (c = (char*)strchr(buf, '=')) == NULL )
					continue;

				memset( keyname, 0, sizeof(keyname) );
				sscanf( buf, "%[^=|^ |^\t]", keyname );

				if( strcmp(keyname, KeyName) == 0 )
				{
					sscanf( ++c, "%[^\n]", KeyVal );
					char *KeyVal_o = (char *)malloc(strlen(KeyVal) + 1);

					if(KeyVal_o != NULL)
					{
						memset(KeyVal_o, 0, sizeof(KeyVal_o));
						a_trim(KeyVal_o, KeyVal);
						if(KeyVal_o && strlen(KeyVal_o) > 0)
							strcpy(KeyVal, KeyVal_o);
						free(KeyVal_o);
						KeyVal_o = NULL;
					}

					found = 2;
					break;
				} 
				else 
				{
					continue;
				}
			}
		}
	}

	fclose( fp );

	if( found == 2 )
		return(0);

	return(-1);
}

void main()
{
	char ip[16];
	GetProfileString("./cls.conf", "cls_server", "ip", ip);
	printf("%s\n",ip);
	return;
}


/*
 -- cls.conf文件内容 --

[cls_server]
#配置文件等号左右可以有空格也可以没有
ip=192.16.31.2

*/



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值