C++11:读取properties文件的第三方库cpp_properties

Posted 10km

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++11:读取properties文件的第三方库cpp_properties相关的知识,希望对你有一定的参考价值。

在Java开发环境中JDK内置了java.util.Properties类用于读取.properties文件,在Java应用开发时广泛用于读取参数配置文件。
最近在C++环境下做一个项目设计,也希望能通过读取.properties文件来获取参数配置文件.在github上找到了这个C++11实现的读取.properties文件的项目github.com/glywk/cpp_properties 。完全支持Java properteis语法。
cpp_properties使用起来很简单,全部源码都是用C++11模板类实现。没有.cpp文件,只要include进来就可以用了。但是需要boost的头文件支持
我看到这个项目时只有2个星,非常不起眼,但代码质量是不错误的,经测试可用,因为项目的README.md写得不太完善,入手时还是摸索了些时间----后续我帮助作者更新了README.md,增加了调用示例.

使用很简单,下载源码直接将项目中的src/include/cpp_properties添加到自己的项目再加上Boost支持就可以用了。

git clone https://github.com/glywk/cpp_properties

以下是调用示例:

cpp_properties_parse_test.cpp(这个示例已经更新到cpp_properties项目中)

#include <cpp_properties/action/properties_action.hpp>
#include <cpp_properties/actor/properties_actor.hpp>
#include <cpp_properties/actor/traits/properties_actor_traits.hpp>
#include <cpp_properties/parser.hpp>
#include <map>
/** 测试数据  */
static const std::string DEFAULT_PROPERTIES = R"(
# Message Queue Type(REDIS,MQTT)
mq.implType=MQTT
# connect host
mq.connect.host=127.0.0.1
# connect port
mq.connect.port=1883
# user name for connections
#mq.connect.username=
# password for connections
#mq.connect.password=
# timeout(mills)
#mq.connect.timeout_ms=
# max count of reconnection
#mq.connect.max_reconnects=
# interval(mills) of reconnection
#mq.connect.reconnect_interval_ms=
)";

/*!
 * the main function simply parse the given proerties string into  
 * std::map<std::string, std::string>,if sucess,output all key=value to console.
 */
int main(int argc, char* argv[])


  std::map<std::string, std::string> cpp_properties;
  /** 解析properties数据结果保存到cpp_properties (map对象) */
  auto success = cpp_properties::parse(DEFAULT_PROPERTIES.begin(), DEFAULT_PROPERTIES.end(), cpp_properties);
  // print results
  if (success) 
  	  /** 遍历cpp_properties (map对象)所有的节点输出DEFAULT_PROPERTIES所有有效内容 */
      for (auto p : cpp_properties) 
          std::cout << p.first << '=' << p.second << "\\n";
      
   else 
      /** 解析失败报错 */
      std::cout << "Lexical analysis failed\\n"
          << "stopped at: \\"" << DEFAULT_PROPERTIES << "\\"\\n";
  
  return 0;

gcc编译:

g++ -o cpp_properties_parse_test -std=c++11 \\
	-I $BOOST_INCLUDE_DIR \\
	-I $CPP_PROPERTIES_DIR/src/include \\
	-Wno-deprecated-declarations \\
	cpp_properties_parse_test.cpp

$BOOST_INCLUDE_DIR为boost的include文件夹位置
$CPP_PROPERTIES_DIR为cpp_properties项目的位置

MSVC命令行编译(VS2015开发人员命令提示)

cl cpp_properties_parse_test.cpp ^
	/I$CPP_PROPERTIES_DIR\\src\\include ^
	/I$BOOST_INCLUDE_DIR /wd4819 ^
	cpp_properties_parse_test.cpp

执行生成的cpp_properties_parse_test exe程序

./cpp_properties_parse_test
mq.connect.host=127.0.0.1
mq.connect.port=1883
mq.implType=MQTT

以上是关于C++11:读取properties文件的第三方库cpp_properties的主要内容,如果未能解决你的问题,请参考以下文章

怎么使用C语言读取properties配置文件

怎么使用C语言读取properties配置文件

Android 11 (R) 文件路径访问

gcc 可以用旧的第三方库编译 C++17 代码吗?

任何 C++11 线程安全保证是不是适用于使用 C++11 编译/链接的第三方线程库?

读取properties文件的信息