linux下配置信息,Linux下获取配置文件信息

在项目中经常会用到一些配置文件,在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

#include

#include

#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 */

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

#include

#include

#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]$

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值