/*从配置文件取参数*/
int GetParameter(char *File,char *Section,char *Keyword,char *Buffer,int Size)
{
FILE *fp;
char buf[400],tmpbuf[400];
char Sec[400] ,Key[400];
int SecFlag = 0;
char *ptb , *psend ;
int len ;
if(!(fp = fopen(File , "r")))
{
printf( "open file=[%s] error",File) ;
return 1 ;
}
sprintf( Sec ,"[%s]",Section );
sprintf( Key ,"%s",Keyword );
while( !feof( fp ) ) {
memset( buf ,0x0 ,sizeof(buf ));
fgets(buf,sizeof(buf),fp);
if( buf[ 0 ] == '#' )
continue ;
else if( memcmp(buf ,Sec ,strlen(Sec)) == 0 )
{
SecFlag = 1;
continue;
}
else if(( buf[0] == '[' ) && SecFlag == 1 )
{
break;
}
else
if( SecFlag == 1 )
{
if(memcmp( buf ,Key ,strlen(Key) ) == 0 )
{
memset( tmpbuf ,0x0 ,sizeof(tmpbuf));
memcpy( tmpbuf ,&buf[strlen(Key)] ,strlen(buf) - strlen(Key) );
len = strlen ( tmpbuf );
if( tmpbuf[len-1] == '\n' )
tmpbuf[len-1 ] = 0x0 ;
len = strlen ( tmpbuf );
ptb = tmpbuf ;
while( *ptb == ' ' || * ptb == '=' )
ptb ++ ;
if( ptb - tmpbuf >= strlen(tmpbuf) )
break;
Size = len -( ptb - tmpbuf ) ;
memcpy( Buffer ,ptb ,Size );
SecFlag = 2;
break;
}
continue;
}
}
fclose(fp);
if (SecFlag == 1 || SecFlag == 0 )
return 1 ;
else
return 0;
}
修改版本:添加了更新键值的函数
/*******************************************************************
作 者: Kevin Liu
函数功能: 从配置文件取参数键值
入口参数: File,文件路径;Section,[配置模块];
Keyword,键名;Value,存取键值;Size,键值长度
返 回 值: 0-成功;失败:1-程序出错;2-找不到配置模块;
3-找不到键名;4-配置模块和键名可以找到但是没有键值;
备 注: 20130925
********************************************************************/
u8 GetParameter(u8 *File,u8 *Section,u8 *Keyword,u8 *Value,u32 *Size)
{
FILE *fp;
u8 buf[1024],tmpbuf[1024];
u8 Sec[100] ,Key[100];
int SecFlag=0;
u8 *ptb;
u32 len=0;
u8 rslt=0;
memset(Sec, 0x00, sizeof(Sec));
memset(Key, 0x00, sizeof(Key));
if((fp = fopen(File , "r"))==NULL)
{
printf( "[LGH-ERR-GetParameter()]open file=[%s] error\r\n",File ) ;
return 1 ;
}
sprintf( Sec ,"[%s]",Section );
sprintf( Key ,"%s",Keyword );
#ifdef LGH_DEBUG
printf("[LGH--GetParameter()]查找开始\r\n");
#endif
while( !feof( fp ) ) {
memset(buf, 0x00, sizeof(buf));
fgets(buf, sizeof(buf), fp);
#ifdef LGH_DEBUG
printf("[LGH--GetParameter()]读取一行:%s\r\n", buf);
#endif
if( buf[0] == '#' )
continue ;
else if( memcmp(buf ,Sec ,strlen(Sec)) == 0 )
{
#ifdef LGH_DEBUG
printf("[LGH--GetParameter()]--找到模块行:%s\r\n", buf);
#endif
SecFlag = 1;
continue;
}
else if(( buf[0] == '[' ) && SecFlag == 1 )
{
#ifdef LGH_DEBUG
printf("[LGH--GetParameter()]该模块中没有此键名\r\n");
#endif
rslt = 3; //找不到键名
break;
}
else
if( SecFlag == 1 ) //找到模块名
{
if(memcmp( buf ,Key ,strlen(Key) ) == 0 )
{
#ifdef LGH_DEBUG
printf("[LGH--GetParameter()]找到键名:%s\r\n", Key);
#endif
memset( tmpbuf ,0x00 ,sizeof(tmpbuf));
memcpy( tmpbuf ,&buf[strlen(Key)] ,strlen(buf)-strlen(Key) );
len = strlen(tmpbuf);
if( (tmpbuf[len-2]=='\r') && (tmpbuf[len-1]=='\n') ) {
tmpbuf[len-2 ] = 0x00;
tmpbuf[len-1 ] = 0x00;
}
else if( tmpbuf[len-1]=='\n' ) {
tmpbuf[len-1 ] = 0x00;
}
TrimR(tmpbuf);
len = strlen(tmpbuf);
ptb = tmpbuf ;
while( *ptb == ' ' || *ptb == '=' || *ptb == '\t' )
ptb ++ ;
if( (ptb-tmpbuf) >= strlen(tmpbuf) ) {
#ifdef LGH_DEBUG
printf("[LGH--GetParameter()]该键值没有配置值\r\n");
#endif
rslt = 4;
break;
}
*Size = len -( ptb - tmpbuf ) ;
memcpy( Value ,ptb ,*Size );
#ifdef LGH_DEBUG
printf("[LGH--GetParameter()]查找键值成功\r\n");
#endif
rslt = 0;
break;
}
continue;
}
}
fclose(fp);
if ( SecFlag == 0 ) {
#ifdef LGH_DEBUG
printf("[LGH--GetParameter()]没找到配置模块\r\n");
#endif
rslt = 2 ; //没找到配置模块
}
return rslt;
}
/*******************************************************************
作 者: Kevin Liu
函数功能: 修改配置文件的参数键值
入口参数: File,文件路径;Section,[配置模块];
Keyword,键名;Value,存取键值;Size,键值长度
返 回 值: 0-成功;1-失败
备 注: 20130925
********************************************************************/
u8 SetParameter(u8 *File,u8 *Section,u8 *Keyword,u8 *Value,u32 Size)
{
FILE *fp;
u8 buf[1024], LineBuffer[1024];
u8 Sec[100] ,Key[100];
u32 SecFlag = 0;
u8 *pFileLeft;
u32 LineLen=0, FileSize=0, FileLeftLen=0, ModifySize=0;
struct stat fs;
#ifdef LGH_DEBUG
printf("[LGH--SetParameter()]--begin\r\n");
#endif
memset(Sec, 0x00, sizeof(Sec));
memset(Key, 0x00, sizeof(Key));
memset(&fs, 0, sizeof(struct stat));
if( stat(File, &fs)==0 ) { //off_t st_size;
FileSize = fs.st_size;
}
pFileLeft = (u8 *)malloc(FileSize);
if( pFileLeft == NULL ) {
#ifdef LGH_DEBUG
printf("[LGH-ERR-SetParameter()]申请内存出错\r\n");
#endif
return 1;
}
memset(pFileLeft, 0, FileSize);
memset(LineBuffer, 0, sizeof(LineBuffer));
sprintf( LineBuffer ,"%s=", Keyword);
ModifySize = strlen(LineBuffer);
memcpy(LineBuffer+ModifySize, Value, Size);
ModifySize += Size;
memcpy(LineBuffer+ModifySize, "\r\n", 2);
ModifySize += 2;
if(!(fp = fopen(File , "r+")))
{
#ifdef LGH_DEBUG
printf( "[LGH-ERR-SetParameter()]open file=[%s] error\r\n",File) ;
#endif
return 1 ;
}
sprintf( Sec ,"[%s]",Section );
sprintf( Key ,"%s",Keyword );
while( !feof( fp ) ) {
memset(buf, 0x00, sizeof(buf));
fgets(buf, sizeof(buf), fp);
LineLen = strlen(buf);
FileLeftLen = ( FileSize - ftell(fp) );
if( buf[0] == '#' )
continue ;
else if( memcmp(buf ,Sec ,strlen(Sec)) == 0 )
{
SecFlag = 1;
continue;
}
else if(( buf[0] == '[' ) && SecFlag == 1 )
{
break;
}
else
if( SecFlag == 1 )
{
if(memcmp( buf ,Key ,strlen(Key) ) == 0 )
{
#ifdef LGH_DEBUG
printf("[LGH--SetParameter()]找到键名,准备更新:%s\r\n", Key);
#endif
fread(pFileLeft, sizeof(char), FileLeftLen, fp);
fseek(fp, 0-LineLen-FileLeftLen, SEEK_CUR);
truncate(File, ftell(fp));
fwrite(LineBuffer, sizeof(char), ModifySize, fp);
fwrite(pFileLeft, sizeof(char), FileLeftLen, fp);
SecFlag = 2;
#ifdef LGH_DEBUG
printf("[LGH--SetParameter()]更新键名成功:%s\r\n", Key);
#endif
break;
}
continue;
}
}
fclose(fp);
free(pFileLeft);
#ifdef LGH_DEBUG
printf("[LGH--SetParameter()]--end\r\n");
#endif
if (SecFlag == 1 || SecFlag == 0 )
return 1 ;
else
return 0;
}
文件内容格式如下:
[POSP]
BatchNo=000001
SysRefNo=000000000001
AuthorCode=000001