ACE入门配置文件

读写配置文件-ACE_Configuration_Heap类的 用法

HA_Status.cpp

此示例演示了ACE对配置文件的读取的功能,ACE可以方便的从配置文件读取字符串类型、
整数类型、二进制信息
/**
* HA_Status.cpp,v 1.4 2005/06/29 16:35:46 shuston Exp
*
* Home Automation Status server. Sample code from The ACE Programmer's Guide,
* Copyright 2003 Addison-Wesley. All Rights Reserved.
*/


#include "ace/OS_NS_string.h"
#include "ace/Configuration.h"
#include "ace/Configuration_Import_Export.h"
#include "ace/Get_Opt.h"
#include "ace/Log_Msg.h"
#include "ace/INET_Addr.h"
#include "ace/Service_Object.h"

class HA_Status : public ACE_Service_Object
{
public :
virtual int init ( int argc, ACE_TCHAR *argv[ ] ) ;

private :
ACE_INET_Addr listen_addr_;
} ;


int
HA_Status::init ( int argc, ACE_TCHAR *argv[ ] )
{

// Do ACE_Get_Opt and get conf file name, read out the sections
// and print the names.

// Listing 1 code/ch04
static const ACE_TCHAR options[ ] = ACE_TEXT ( ":f:" ) ;
ACE_Get_Opt cmd_opts ( argc, argv, options) ;
if ( cmd_opts.long_option
( ACE_TEXT ( "config" ) , 'f' , ACE_Get_Opt::ARG_REQUIRED ) == -1 )
return -1 ;
int option;
ACE_TCHAR config_file[ MAXPATHLEN] ;
ACE_OS::strcpy ( config_file, ACE_TEXT ( "HAStatus.conf" ) ) ;
while ( ( option = cmd_opts ( ) ) != EOF )
switch ( option) {
case 'f' :
ACE_OS::strncpy ( config_file,
cmd_opts.opt_arg ( ) ,
MAXPATHLEN) ;
break ;
case ':' :
ACE_ERROR_RETURN
( ( LM_ERROR, ACE_TEXT ( "-%c requires an argument/n " ) ,
cmd_opts.opt_opt ( ) ) , -1 ) ;
default :
ACE_ERROR_RETURN
( ( LM_ERROR, ACE_TEXT ( "Parse error./n " ) ) , -1 ) ;
}
// Listing 1

// Listing 2 code/ch04
ACE_Configuration_Heap config;
if ( config.open ( ) == -1 )
ACE_ERROR_RETURN
( ( LM_ERROR, ACE_TEXT ( "%p/n " ) , ACE_TEXT ( "config" ) ) , -1 ) ;
ACE_Registry_ImpExp config_importer ( config) ;
if ( config_importer.import_config ( config_file) == -1 )
ACE_ERROR_RETURN
( ( LM_ERROR, ACE_TEXT ( "%p/n " ) , config_file) , -1 ) ;

ACE_Configuration_Section_Key status_section;
//指定打开HAStatus 节进行读取
if ( config.open_section ( config.root_section ( ) ,
ACE_TEXT ( "HAStatus" ) ,
0 ,
status_section) == -1 )
ACE_ERROR_RETURN ( ( LM_ERROR, ACE_TEXT ( "%p/n " ) ,
ACE_TEXT ( "Can't open HAStatus section" ) ) ,
-1 ) ;

//分别用来保存读取的字符串类型的地址和整形的端口号
u_int status_port;
ACE_TString server_ip ;
//读取取字符串类型的地址属性
if ( config.get_string_value ( status_section,ACE_TEXT ( "ServerIP" ) ,
server_ip)
 ==-1
)
  
ACE_ERROR_RETURN
( ( LM_ERROR,
ACE_TEXT ( "HAStatus ServerIP does not exist/n " ) ) ,
-1 ) ;
//读取整形的端口属性
if ( config.get_integer_value ( status_section,
ACE_TEXT ( "ListenPort" ) ,
status_port) == -1 )
ACE_ERROR_RETURN
( ( LM_ERROR,
ACE_TEXT ( "HAStatus ListenPort does not exist/n " ) ) ,
-1 ) ;
//this->listen_addr_.set (static_cast<u_short> (status_port));
// Listing 2
ACE_DEBUG ( ( LM_DEBUG, ACE_TEXT ( "ServerIP = %s/n " ) ,
server_ip.c_str
(
)
)
)
;
ACE_DEBUG ( ( LM_DEBUG, ACE_TEXT ( "ListenPort = %d" ) ,status_port) ) ;


return 0 ;
}

int
ACE_TMAIN ( int argc, ACE_TCHAR *argv[ ] )
{
HA_Status status;
status.init ( argc, argv) ;
return 0 ;
}
配置文件内容格式
  • [名称]用来定义一个节。
  • 可以用'#' 或';'来作为注释
  • “attribute”=“value”表示一个字符串类型的属性 。
  • attribute=#value 或 表示一个整数类型的属性值。
  • “attribute”=dword:value 表示一个64位的双字(十六进制)
  • “attribute”=hex:value 以十六进制串表示二进制序列

ACE对配置文件的解析和我们通常用的对配置文件读写的类库不太一样1) ,感觉ACE对配置文件的

读取对格式要求比较严格和我们普通使用的配置文件格式兼容性稍差一些。

有以下几点点需要我们注意。

  1. 如果你用来表示一个字符串类型的属性值,你应该用'”'包括你的 属性值属性名称
  2. 否则ACE将不能正常解析
  3. 如果你使用类似”dword:“、”hex:“等前缀表示数字类型的属性值,
  4. 你需要把 属性名称 用'”'包括起来 , 属性值 能用'”'包括起来
  5. 表示整数类型的属性时,属性名称和属性值都不要'”'包括起来
测试程序

配置文件内容

#这用来表示一个"节"
[HAStatus]
;字符串类型的属性值
"ServerIP"="127.0.0.1"
;整数类型的属性值
ListenPort=#8080


注意:配置文件最后一行一定要空一行***

执行结果

D:/project/ACE_wrappers/examples/APG/Config>HA_Status.exe
ServerIP = 127.0.0.1
ListenPort = 8080
1) 象 attribute=value 这样的定义ACE将不能正常解析,这也是我在读了ACE的实现代码后才得知的,
一开始还以为这是一个BUG =)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值