读写配置文件-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对配置文件的
读取对格式要求比较严格和我们普通使用的配置文件格式兼容性稍差一些。
有以下几点点需要我们注意。
-
如果你用来表示一个字符串类型的属性值,你应该用'”'包括你的 属性值 和 属性名称 ,
-
否则ACE将不能正常解析
-
如果你使用类似”dword:“、”hex:“等前缀表示数字类型的属性值,
-
你需要把 属性名称 用'”'包括起来 , 属性值 能用'”'包括起来
-
表示整数类型的属性时,属性名称和属性值都不要'”'包括起来
测试程序
配置文件内容
#这用来表示一个"节"
[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