YAML-CPP

时间:2023-02-17 20:43:24

yaml作为一种便捷的文件格式,通过c++进行操作时,可以利用yaml-cpp进行。

一,yaml-cpp的安装

下载源码

git clone https://github.com/jbeder/yaml-cpp.git

编译安装

mkdir build
cd build
cmake -DBUILD_SHARED_LIBS=ON .. # ON 设置生成共享库
sudo make install

验证

pkg-config --modversion yaml-cpp

使用

YAML::Node node1 = YAML::LoadFile("config.yaml");    // 加载文件
YAML::Node node2 = YAML::Load("[1,2,3]"); // 加载数组
cout << node1[0].as<string>() << endl;
cout << node2[0].as<int>() << endl; // 输出元素

更多API参考yaml-cpp docs

示例:

a、CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(yaml_test)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
link_directories(/home/jonty/Softwares/yaml-cpp/build)
include_directories(/home/jonty/Softwares/yaml-cpp/include/yaml-cpp)
add_executable(test main.cpp)
target_link_libraries(test yaml-cpp)

b、main.cpp

#include <iostream>
#include "yaml.h"
using namespace std;
int main()
{
YAML::Node node = YAML::Load("[22,3,4,4]");
cout << node[0] << endl;
YAML::Node node2 = YAML::LoadFile("../config.yaml");
cout << node2["ttt"] << endl;
return 0;
}

编译运行

mkdir build
cd build
cmake ..
make
./test

参考教程https://github.com/jbeder/yaml-cpp/wiki/Tutorial

编译也可以采用g++ test.cpp /usr/local/lib/libyaml-cpp.a -std=c++11

源码编译yaml-cpp

git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp # 进入克隆的文件夹
mkdir build
cd build
cmake ..
make
make install

可参考https://blog.csdn.net/Fourier_Legend/article/details/82798297

记得在CMakeLists.txt中加入

link_directories(/usr/local/lib)
include_directories(/usr/local/include/yaml-cpp)

以及在链接库target_link_libraries时,加上yaml-cpp。

void write_robot_status_to_yaml(string path, const string &filename,
double x, double y, double th)
{
//dir_file_exists(path, true);
dir_file_exists(path, false, true, filename.c_str());
std::ofstream yaml_file(path + filename, std::ios::out | std::ios::binary);
{
YAML::Emitter out(yaml_file);
out << YAML::BeginMap;
// TODO(whess): Use basename only?
out << YAML::Key << "x";
out << YAML::Value << x;
out << YAML::Key << "y";
out << YAML::Value << y;
out << YAML::Key << "th";
out << YAML::Value << th;
out << YAML::EndMap;
} yaml_file.close();
}
bool read_robot_status_from_yaml(string file_path, const string &file_name,  double &x,
double &y, double &th)
{
if (!dir_file_exists(file_path, false, true, file_name.c_str()))
return false;
std::ifstream yaml_file(file_path + file_name, std::ios::out | std::ios::binary);
{
YAML::Node doc = YAML::Load(yaml_file); doc["x"] >> x;
doc["y"] >> y;
doc["th"] >> th;
}
yaml_file.close(); return true;
}
/*
* @brief 创建文件夹
*/
bool dir_file_exists(string dir, bool mkdir_flag, bool touchfile_flag, string filename)
{
char des_dir[];
str_2_char(dir, des_dir);
int state = access(des_dir, R_OK | W_OK);//#include<unistd.h>
if(state == )
{
ROS_INFO("state == 0");
return true;
}
else if(mkdir_flag)
{
dir = "mkdir " + dir;
str_2_char(dir, des_dir);
if(system(des_dir))
{
printf("generate dir %s successfully.",dir.c_str());
ROS_INFO("generate dir %s successfully.",dir.c_str());
//Basic_Info("generate dir {} successfully.",dir.c_str());
}
else
{
printf("generate dir %s fail.",dir.c_str());
ROS_INFO("generate dir %s fail.",dir.c_str());
//Basic_Info("generate dir {} fail.",dir.c_str());
}
return true;
}
else if(touchfile_flag)
{
dir = "touch " + dir + "/" + filename;
ROS_INFO("dir is %s", dir.c_str());
str_2_char(dir, des_dir);
if(system(des_dir))
{
printf("generate filename %s successfully.",dir.c_str());
ROS_INFO("generate filename %s successfully.",dir.c_str());
//Basic_Info("generate filename {} successfully.",dir.c_str());
}
else
{
printf("generate filename %s fail.",dir.c_str());
ROS_INFO("generate filename %s fail.",dir.c_str());
//Basic_Info("generate filename {} fail.",dir.c_str());
}
return true;
}
return false;
}
template <typename T>
void operator>>(const YAML::Node& node, T& i); template <typename T>
void operator>>(const YAML::Node& node, T& i) {
i = node.as<T>();
};

写个模板类加载参数

template<typename T>
T getParam(const string& name,const T& defaultValue)  //This name must be namespace+parameter_name
{
T v;
if(ros::param::get(name,v))  //get parameter by name depend on ROS.
{
ROS_INFO_STREAM("Found parameter: "<<name<<",\tvalue: "<<v);
return v;
}
else
ROS_WARN_STREAM("Cannot find value for parameter: "<<name<<",\tassigning default: "<<defaultValue);
return defaultValue;  //if the parameter haven't been set,it's value will return defaultValue.
}

在ROS系统中,参数读写一般通过xml或者yaml格式的文件,其中yaml用得比较多。这是一种可读性高,轻量级的标记语言,简单好用。
对于yaml文件,ros中用的较早版本的yaml-cpp库,最新的可在github上下载,并按照readme中所述的方法编译安装。

特别留意的是,如果需要生成共享库,cmake的时候后面一定要加上 -DBUILD_SHARED_LIBS=ON 这句话。

有了yaml库,在CMakeLists.txt中加入,

link_directories(/usr/local/lib)
include_directories(/usr/local/include/yaml-cpp)

最后别忘了在链接库target_link_libraries时,加上yaml-cpp。
关于库的使用,github上有一些简单的tutorial教程

以下是简单的yaml文件读写操作示例。

#include <ros/ros.h>
#include <yaml-cpp/yaml.h>
#include <iostream>
#include <fstream> int main(int argc, char **argv)
{
std::string fin = "/home/user/param/param.yaml"; //yaml文件所在的路径
YAML::Node yamlConfig = YAML::LoadFile(fin);
int int_param = yamlConfig["int_param"].as<int>();
std::cout << " node size: " << yamlConfig.size() << std::endl;
std::cout << yamlConfig["bool_param"].as<bool>() << "\n";
yamlConfig["bool_param"] = !yamlConfig["bool_param"].as<bool>();
yamlConfig["str_param"] = "test";
std::ofstream file;
file.open(fin);
file.flush();
file << yamlConfig;
file.close(); return ;
}

其中,yaml文件里的内容为:

bool_param: true
int_param: 2
double_param: 0.5
str_param: "123"

也可采用Emit来生成yaml文件,代码如下:

#include <ros/ros.h>
#include <yaml-cpp/yaml.h>
#include <iostream>
#include <fstream> int main(int argc, char **argv)
{
std::ofstream fout("/home/user/param/param.yaml");
YAML::Emitter out(fout);
out << YAML::BeginMap;
out << YAML::Key << "int_param";
out << YAML::Value << ;
out << YAML::Key << "double_param";
out << YAML::Value << 0.5;
out << YAML::Key << "bool_param";
out << YAML::Value << false;
out << YAML::Comment("bool parameter");
out << YAML::Key << "str_param";
out << YAML::Value << "test";
out << YAML::EndMap; return ;
}

yml文件的其他操作可参见博文《.yaml参数文件的编写和使用》,

其综合运用的案例可参见博文:ros-opencv-qt-yaml综合运用之滤波

YAML-CPP的更多相关文章

  1. c&plus;&plus; 解析yaml文件

    一直用c++操作ini做配置文件,想换成yaml,在全球最大的同性交友网站github上搜索,看有没有开源的库,功夫不负有心人,找到了yaml-cpp,用他解析了一个yaml的例子非常好使,分享一下如 ...

  2. C&num;与yaml解析

    YAML 官方网站称 YAML 是"一种所有编程语言可用的友好的数据序列化标准".YAML Ain't Markup Language,和GNU一样,YAML是一个递归着说&quo ...

  3. 使用&OpenCurlyDoubleQuote;Cocos引擎”创建的cpp工程如何在VS中调试Cocos2d-x源码

    前段时间Cocos2d-x更新了一个Cocos引擎,这是一个集合源码,IDE,Studio这一家老小的整合包,我们可以使用这个Cocos引擎来创建我们的项目. 在Cocos2d-x被整合到Cocos引 ...

  4. SpringBoot中yaml配置对象

    转载请在页首注明作者与出处 一:前言 YAML可以代替传统的xx.properties文件,但是它支持声明map,数组,list,字符串,boolean值,数值,NULL,日期,基本满足开发过程中的所 ...

  5. Json CPP 中文支持与入门示例

    在每一个Json Cpp自带*.cpp文件头加上: #include "stdafx.h" 将Json Cpp对自带的头文件的引用修改为单引号方式,例如json_reader.cp ...

  6. cpp 调用python

    在用cpp调用python时, 出现致命错误: no module named site  ,  原因解释器在搜索路径下没有找到python库.可以在调用Py_Initialize前,调用 Py_Se ...

  7. nginx&plus;fastcgi&plus;c&sol;cpp

    参考:http://github.tiankonguse.com/blog/2015/01/19/cgi-nginx-three/ 跟着做了一遍,然后根据记忆写的,不清楚有没错漏步骤,希望多多评论多多 ...

  8. APM程序分析-ArduCopter&period;cpp

    该文件是APM的主文件. #define SCHED_TASK(func, rate_hz, max_time_micros) SCHED_TASK_CLASS(Copter, &copter ...

  9. APM程序分析-AC&lowbar;WPNav&period;cpp

    APM程序分析 主程序在ArduCopter.cpp的loop()函数. /// advance_wp_target_along_track - move target location along ...

  10. Dev Cpp 输出中文字符问题

    最近 c++ 上机作业,vc++6.0 挂了没法用,只好用 Dev Cpp 先顶替一下,然而在遇到输出中文字符的时候出现了乱码的情况,但这种情况又非常诡异.于是简单了解了一下写成此博客. [写在前面] ...

随机推荐

  1. ABP框架 - 动态Web Api层

    文档目录 本节内容: 创建动态Web Api控制器 ForAll 方法 重写 ForAll ForMethods Http 动词 WithVerb 方法 HTTP 特性 命名约定 Api 浏览器 Re ...

  2. php mail 函数发送邮件

    当然你可以通过php ,在自己的站点制作一个反馈表单, 我这次的需求是用email 的形式发送数据报表,结构比较简单 // 收件人地址(此处只可以写一个地址,写多个地址,只有最后一个地址生效) $to ...

  3. 一个相比jdk的io包更方便处理数据读写的包

    apche的commons-io.jar包,里面有个类IOUtils,提供的下列方法: readLines方法能够从字节输入流或字符输入流里读取数据,按行读,返回字符串组成的list write方法能 ...

  4. ROS2&period;9&period;27架设网吧软路由实战篇之端口映射与回流

    转载:http://blog.csdn.net/zm2714/article/details/7924280 上一篇:ROS2.9.27架设网吧软路由实战篇之连通网络,主要讲述了网吧架设软路由ROS2 ...

  5. caches 文件夹删除

    模拟器 可以 删除 真机不行

  6. Thinkphp框架----微信公众测试号开发

    最开始的一个步骤.注册一个微信公众测试号.URL:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login; 接口配置的信息,对新手 ...

  7. &lbrack;AngularJS&rsqb; Introduction to ui-router

    Introduce to basic $stateProvider.state() with $stateParams services. Understand how nested router w ...

  8. qemu kvm 虚拟化

    虚拟化: KVM是一个基于Linux内核的虚拟机,属于完全虚拟化.虚拟机监控的实现模型有两类:监控模型(Hypervisor)和宿主机模型(Host-based).由于监控模型需要进行处理器调度,还需 ...

  9. Android常用功能代码块(转)

    1.设置activity无标题,全屏 // 设置为无标题栏 requestWindowFeature(Window.FEATURE_NO_TITLE); // 设置为全屏模式 getWindow(). ...

  10. MySQL在并发场景下的问题及解决思路

    目录 1.背景 2.表锁导致的慢查询的问题 3.线上修改表结构有哪些风险? 4.一个死锁问题的分析 5.锁等待问题的分析 6.小结 1.背景 对于数据库系统来说在多用户并发条件下提高并发性的同时又要保 ...

相关文章