在项目中经常会用到一些配置文件,在Windows下其后缀是.ini。例如:端口配置.ini
配置文件由节、键、值组成。


[section]
键=值
name=value

下面主要用C来实现在Linux下获取配置文件中键的值:

如配置文件为sysconfig,在Linux下一般配置文件放在对应的/etc目录下

//sysconfig文件信息

[Config1]
PORT=8080
#HOSTIP=192.168.1.1
HOSTIP=192.168.1.2
SENDIP=192.168.1.3

 

[Config2]
PORT=5050
#HOSTIP=192.168.1.1
HOSTIP=192.122.16.19
SENDIP=192.122.16.19

[Config3]
PORT=1666
#HOSTIP=192.168.1.1
HOSTIP=192.168.12.2
SENDIP=192.168.12.3


 

//config.h

/*************************************************************     
    FileName : config.h 
    FileFunc : 定义头文件    
    Version  : V0.1     
    Author   : Sunrier     
    Date     : 2012-05-09 
    Descp    : Linux下获取配置文件信息     
*************************************************************/
#ifndef   _CONFIG_H
#define   _CONFIG_H

#ifdef __cplusplus
extern "C" {
#endif

#define  SUCCESS           0x00 /*成功*/
#define  FAILURE           0x01 /*失败*/

#define  FILENAME_NOTEXIST      0x02 /*配置文件名不存在*/
#define  SECTIONNAME_NOTEXIST    0x03 /*节名不存在*/
#define  KEYNAME_NOTEXIST      0x04 /*键名不存在*/
#define  STRING_LENNOTEQUAL     0x05 /*两个字符串长度不同*/
#define  STRING_NOTEQUAL       0x06 /*两个字符串内容不相同*/
#define  STRING_EQUAL        0x00 /*两个字符串内容相同*/


int CompareString(char *pInStr1,char *pInStr2);
int GetKeyValue(FILE *fpConfig,char *pInKeyName,char *pOutKeyValue);
int GetConfigIntValue(char *pInFileName,char *pInSectionName,char *pInKeyName,int *pOutKeyValue);
int GetConfigStringValue(char *pInFileName,char *pInSectionName,char *pInKeyName,char *pOutKeyValue);

#ifdef __cplusplus
}
#endif

#endif


 

//config.c

/*************************************************************     
    FileName : config.c 
    FileFunc : 定义实现文件    
    Version  : V0.1     
    Author   : Sunrier     
    Date     : 2012-05-09 
    Descp    : Linux下获取配置文件信息    
*************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "config.h"

int GetConfigStringValue(char *pInFileName,char *pInSectionName,char *pInKeyName,char *pOutKeyValue)
{
	FILE *fpConfig;
	char szBuffer[150];
	char *pStr1,*pStr2;
	int iRetCode = 0;
	
	/*test*/
	/*
	printf("pInFileName: %s !\n",pInFileName);
	printf("pInSectionName: %s !\n",pInSectionName);
	printf("pInKeyName: %s !\n",pInKeyName);
	*/
	
	memset(szBuffer,0,sizeof(szBuffer));
	if( NULL==( fpConfig=fopen(pInFileName,"r") ) )
		return FILENAME_NOTEXIST;
		
	while( !feof(fpConfig) )
	{
		if( NULL==fgets(szBuffer,150,fpConfig) )
			break;
		pStr1 = szBuffer ;	
		while( (' '==*pStr1) || ('\t'==*pStr1) )
			pStr1++;
		if( '['==*pStr1 )
		{
			pStr1++;
			while( (' '==*pStr1) || ('\t'==*pStr1) )
				pStr1++;
			pStr2 = pStr1;
			while( (']'!=*pStr1) && ('\0'!=*pStr1) )
				pStr1++;
			if( '\0'==*pStr1)	
				continue;
			while( ' '==*(pStr1-1) )
				pStr1--;	
			*pStr1 = '\0';
					
			iRetCode = CompareString(pStr2,pInSectionName);	
			if( !iRetCode )/*检查节名*/
			{
				iRetCode = GetKeyValue(fpConfig,pInKeyName,pOutKeyValue);
				fclose(fpConfig);
				return iRetCode;
			}	
		}					
	}
	
	fclose(fpConfig);
	return SECTIONNAME_NOTEXIST;
	
}	

/*区分大小写*/
int CompareString(char *pInStr1,char *pInStr2)
{
	if( strlen(pInStr1)!=strlen(pInStr2) )
	{
		return STRING_LENNOTEQUAL;
	}	
		
	/*while( toupper(*pInStr1)==toupper(*pInStr2) )*//*#include <ctype.h>*/
	while( *pInStr1==*pInStr2 )
	{
		if( '\0'==*pInStr1 )
			break;	
		pInStr1++;
		pInStr2++;	
	}
	
	if( '\0'==*pInStr1 )
		return STRING_EQUAL;
		
	return STRING_NOTEQUAL;	
	
}

int GetKeyValue(FILE *fpConfig,char *pInKeyName,char *pOutKeyValue)
{
	char szBuffer[150];
	char *pStr1,*pStr2,*pStr3;
	unsigned int uiLen;
	int iRetCode = 0;
	
	memset(szBuffer,0,sizeof(szBuffer));	
	while( !feof(fpConfig) )
	{	
		if( NULL==fgets(szBuffer,150,fpConfig) )
			break;
		pStr1 = szBuffer;	
		while( (' '==*pStr1) || ('\t'==*pStr1) )
			pStr1++;
		if( '#'==*pStr1 )	
			continue;
		if( ('/'==*pStr1)&&('/'==*(pStr1+1)) )	
			continue;	
		if( ('\0'==*pStr1)||(0x0d==*pStr1)||(0x0a==*pStr1) )	
			continue;	
		if( '['==*pStr1 )
		{
			pStr2 = pStr1;
			while( (']'!=*pStr1)&&('\0'!=*pStr1) )
				pStr1++;
			if( ']'==*pStr1 )
				break;
			pStr1 = pStr2; 	
		}	
		pStr2 = pStr1;
		while( ('='!=*pStr1)&&('\0'!=*pStr1) )
			pStr1++;
		if( '\0'==*pStr1 )	
			continue;
		pStr3 = pStr1+1;
		if( pStr2==pStr1 )
			continue;	
		*pStr1 = '\0';
		pStr1--;
		while( (' '==*pStr1)||('\t'==*pStr1) )
		{
			*pStr1 = '\0';
			pStr1--;
		}
		
		iRetCode = CompareString(pStr2,pInKeyName);
		if( !iRetCode )/*检查键名*/
		{
			pStr1 = pStr3;
			while( (' '==*pStr1)||('\t'==*pStr1) )
				pStr1++;
			pStr3 = pStr1;
			while( ('\0'!=*pStr1)&&(0x0d!=*pStr1)&&(0x0a!=*pStr1) )
			{
				if( ('/'==*pStr1)&&('/'==*(pStr1+1)) )
					break;
				pStr1++;	
			}	
			*pStr1 = '\0';
			uiLen = strlen(pStr3);
			memcpy(pOutKeyValue,pStr3,uiLen);
			*(pOutKeyValue+uiLen) = '\0';
		 	return SUCCESS;
		}
	}
	
	return KEYNAME_NOTEXIST;
}

int GetConfigIntValue(char *pInFileName,char *pInSectionName,char *pInKeyName,int *pOutKeyValue)
{
	int iRetCode = 0;
	char szKeyValue[16],*pStr;
	
	memset(szKeyValue,0,sizeof(szKeyValue));
	iRetCode = GetConfigStringValue(pInFileName,pInSectionName,pInKeyName,szKeyValue);
	if( iRetCode )
		return iRetCode;
	pStr	= szKeyValue;
	while( (' '==*pStr)||('\t'==*pStr))
		pStr++;
	if( ('0'==*pStr)&&( ('x'==*(pStr+1))||('X'==*(pStr+1)) ) )	
		sscanf(pStr+2,"%x",pOutKeyValue);
	else
		sscanf(pStr,"%d",pOutKeyValue);
		
	return SUCCESS;	
			
}


 

//测试实现功能test.c

/*************************************************************     
    FileName : test.c 
    FileFunc : 定义测试功能文件    
    Version  : V0.1     
    Author   : Sunrier     
    Date     : 2012-05-09 
    Descp    : Linux下获取配置文件信息     
*************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "config.h"

int main (int argc,char *argv[])
{
	char szFileName[100];/*配置文件名*/
	char szSectionName[100];/*节名*/
	char szKeyName[100];/*键名*/	
	char szKeyValue[100];/*键值*/	
	int iRetCode = 0;
	int iPort = -1;
	char szHostIp[30];
	
	memset(szFileName,0,sizeof(szFileName));
	sprintf(szFileName,"%s/etc/sysconfig",getenv("HOME"));
	memset(szSectionName,0,sizeof(szSectionName));
	memcpy(szSectionName,argv[1],sizeof(argv[1]));
	memset(szKeyName,0,sizeof(szKeyName));
	memcpy(szKeyName,argv[2],sizeof(argv[2]));
	memset(szKeyValue,0,sizeof(szKeyValue));
	memset(szHostIp,0,sizeof(szHostIp));
	
	iRetCode = GetConfigStringValue(szFileName,argv[1],argv[2],szHostIp);
	if( iRetCode )
	{
		printf("iRetCode : %d !\n",iRetCode );
	}
	else
	{
		printf("HOSTIP: %s\n",szHostIp);
	}
	
	iRetCode = GetConfigIntValue(szFileName,"Config1","PORT",&iPort);
	if( iRetCode )
	{
		printf("iRetCode : %d !\n",iRetCode );
	}
	else
	{
		printf("PORT: %d\n",iPort);
	}
	
	return 0;
}


 

写一个makefile文件

//makefile

#makefile开始 
all:Manager

#定义宏
OBJS = test.o config.o 

#which compiler
CC = gcc

#where are include files kept
INCLUDE = .

#Options -O for release and -g for development
#-Wall:输出所有的警告信息
#-O:在编译时进行优化
#-g:表示编译debug版本
CFLAGS = -g -Wall -ansi 
#CFLAGS = -O -Wall -ansi

#前面加@不回显执行的命令在标准输出上
Manager:$(OBJS)
	@$(CC)  -o Manager $(OBJS)
#gcc test.o config.o -o Manager
test.o:test.c config.h
	@$(CC) -I$(INCLUDE) $(CFLAGS) -c test.c -o test.o
config.o:config.c config.h
	@$(CC) -I$(INCLUDE) $(CFLAGS) -c config.c -o config.o
clean :
	@rm -rf *.o
#makefile结束


 

测试运行结果:

[Sunrier@localhost Sunrier]$ make
[Sunrier@localhost Sunrier]$ ./Manager Config1 HOSTIP
HOSTIP: 192.168.1.2
PORT: 8080
[Sunrier@localhost Sunrier]$

 

 

 

 

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐