从配置文件取参数

/*从配置文件取参数*/
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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值