Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9392974
  • 博文数量: 1747
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 20060
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1747)

文章存档

2024年(23)

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: 其他平台

2021-05-27 10:57:28

ROS默认用的yaml的 KV.  相对json而言, 更直观易懂

点击(此处)折叠或打开

  1. Yaml的动态读写. 参考 

  2. YAML::Node config = YAML::LoadFile("config.yaml");

  3. if (config["lastLogin"]) {
  4.   std::cout << "Last logged in: " << config["lastLogin"].as<DateTime>() << "\n";
  5. }

  6. const std::string username = config["username"].as<std::string>();
  7. const std::string password = config["password"].as<std::string>();
  8. login(username, password);
  9. config["lastLogin"] = getCurrentDateTime();

  10. std::ofstream fout("config.yaml");
  11. fout << config

点击(此处)折叠或打开

  1. yaml文件的所有节点包括root 都是 YAML::Node

  2. YAML::Node node = YAML::Load("[1, 2, 3]");
  3. assert(node.Type() == YAML::NodeType::Sequence); //序列类型, 有很多种类型
  4. assert(node.IsSequence()); // a

  5. --------------------------------------------
  6. --------------------------------------------
  7. sequences 以及 maps 类型节点可以按照 std::vector/maps 进行操作

  8. YAML::Node primes = YAML::Load("[2, 3, 5, 7, 11]");
  9. for (std::size_t i=0;i<primes.size();i++) {
  10.   std::cout << primes[i].as<int>() << "\n";
  11. }
  12. // or:
  13. for (YAML::const_iterator it=primes.begin();it!=primes.end();++it) {
  14.   std::cout << it->as<int>() << "\n";
  15. }

  16. primes.push_back(13);
  17. assert(primes.size() == 6);
  18. ----------------------------
  19. //maps 类型
  20. YAML::Node lineup = YAML::Load("{1B: Prince Fielder, 2B: Rickie Weeks, LF: Ryan Braun}");
  21. for(YAML::const_iterator it=lineup.begin();it!=lineup.end();++it) {
  22.   std::cout << "Playing at " << it->first.as<std::string>() << " is " << it->second.as<std::string>() << "\n";
  23. }

  24. lineup["RF"] = "Corey Hart";
  25. lineup["C"] = "Jonathan Lucroy";
  26. assert(lineup.size() == 5);
  27. ----------------------------
  28. 查询键是不会自动创建键的.
  29. YAML::Node node = YAML::Load("{name: Brewers, city: Milwaukee}");
  30. if (node["name"]) {
  31.   std::cout << node["name"].as<std::string>() << "\n";
  32. }
  33. if (node["mascot"]) {
  34.   std::cout << node["mascot"].as<std::string>() << "\n";
  35. }
  36. assert(node.size() == 2); // the previous call didn

点击(此处)折叠或打开

  1. 建立 yaml::node
  2. YAML::Node node; // starts out as null
  3. node["key"] = "value"; // it now is a map node
  4. node["seq"].push_back("first element"); // node["seq"] automatically becomes a sequence
  5. node["seq"].push_back("second element");

  6. node["mirror"] = node["seq"][0]; // this creates an alias
  7. node["seq"][0] = "1st element"; // this also changes node["mirror"]
  8. node["mirror"] = "element #1"; // and this changes node["seq"][0] - they're really the "same" node

  9. node["self"] = node; // you can even create self-aliases
  10. node[node["mirror"]] = node["seq"]; // and strange loops :)

  11. 此时内容
  12. &1
  13. key: value
  14. &2 seq: [&3 "element #1", second element]
  15. mirror: *3
  16. self: *1
  17. *3 : *2

点击(此处)折叠或打开

  1. ----------------------------------------
  2. 列表Sequences 自动转化 maps 的情况. 如果在索引序列之内,则保持 sequences 状态, 如果超出索引序列,例如非整数的下标, 以及超出个数的下标, 则 Sequences 会被转换成 maps

  3. YAML::Node node = YAML::Load("[1, 2, 3]");
  4. node[1] = 5; // still a sequence, [1, 5, 3]
  5. node.push_back(-3) // still a sequence, [1, 5, 3, -3]
  6. node["key"] = "value"; // now it's a {0: 1, 1: 5, 2: 3, 3: -3, key: value}

  7. ----------------------------------------
  8. YAML::Node node = YAML::Load("[1, 2, 3]");
  9. node[3] = 4; // still a sequence, [1, 2, 3, 4]
  10. node[10] = 10; // // now it's a {0: 1, 1: 2, 2: 3, 3: 4, 10: 10}
和原生数据的相互转换.
点击(此处)折叠或打开
  1. YAML::Node node = YAML::Load("{pi: 3.14159, [0, 1]: integers}");

  2. // this needs the conversion from Node to double
  3. double pi = node["pi"].as<double>();

  4. // this needs the conversion from double to Node
  5. node["e"] = 2.71828;

  6. // this needs the conversion from Node to std::vector<int> (*not* the other way
  7. std::vector<int> v;
  8. v.push_back(0);
  9. v.push_back(1);
  10. std::string str = node[v].as<std::string>()

点击(此处)折叠或打开

  1. 自定义类型需要重载 YAML::convert<> template class

  2. struct Vec3 { double x, y, z; /* etc - make sure you have overloaded operator== */ };

  3. namespace YAML {
  4. template<>
  5. struct convert<Vec3> {
  6.   static Node encode(const Vec3& rhs) {
  7.     Node node;
  8.     node.push_back(rhs.x);
  9.     node.push_back(rhs.y);
  10.     node.push_back(rhs.z);
  11.     return node;
  12.   }

  13.   static bool decode(const Node& node, Vec3& rhs) {
  14.     if(!node.IsSequence() || node.size() != 3) {
  15.       return false;
  16.     }

  17.     rhs.x = node[0].as<double>();
  18.     rhs.y = node[1].as<double>();
  19.     rhs.z = node[2].as<double>();
  20.     return true;
  21.   }
  22. };
  23. }

  24. 然后就可以应用了
  25. YAML::Node node = YAML::Load("start: [1, 3, 0]");
  26. Vec3 v = node["start"].as<Vec3>();
  27. node["end"] = Vec3(2, -1, 0)
例如复杂一点的解析范例

点击(此处)折叠或打开

  1. monsters.yaml

  2. - name: Ogre
  3.   position: [0, 5, 0]
  4.   powers:
  5.     - name: Club
  6.       damage: 10
  7.     - name: Fist
  8.       damage: 8
  9. - name: Dragon
  10.   position: [1, 0, 10]
  11.   powers:
  12.     - name: Fire Breath
  13.       damage: 25
  14.     - name: Claws
  15.       damage: 15
  16. - name: Wizard
  17.   position: [5, -3, 0]
  18.   powers:
  19.     - name: Acid Rain
  20.       damage: 50
  21.     - name: Staff
  22.       damage: 3

点击(此处)折叠或打开

  1. #include "yaml-cpp/yaml.h"
  2. #include <iostream>
  3. #include <fstream>
  4. #include <string>
  5. #include <vector>

  6. // our data types
  7. struct Vec3 {
  8.    float x, y, z;
  9. };

  10. struct Power {
  11.    std::string name;
  12.    int damage;
  13. };

  14. struct Monster {
  15.    std::string name;
  16.    Vec3 position;
  17.    std::vector <Power> powers;
  18. };

  19. // now the extraction operators for these types
  20. void operator >> (const YAML::Node& node, Vec3& v) {
  21.    node[0] >> v.x;
  22.    node[1] >> v.y;
  23.    node[2] >> v.z;
  24. }

  25. void operator >> (const YAML::Node& node, Power& power) {
  26.    node["name"] >> power.name;
  27.    node["damage"] >> power.damage;
  28. }

  29. void operator >> (const YAML::Node& node, Monster& monster) {
  30.    node["name"] >> monster.name;
  31.    node["position"] >> monster.position;
  32.    const YAML::Node& powers = node["powers"];
  33.    for(unsigned i=0;i<powers.size();i++) {
  34.       Power power;
  35.       powers[i] >> power;
  36.       monster.powers.push_back(power);
  37.    }
  38. }

  39. int main()
  40. {
  41.    std::ifstream fin("monsters.yaml");
  42.    YAML::Parser parser(fin);
  43.    YAML::Node doc;
  44.    parser.GetNextDocument(doc);
  45.    for(unsigned i=0;i<doc.size();i++) {
  46.       Monster monster;
  47.       doc[i] >> monster;
  48.       std::cout << monster.name << "\n";
  49.    }

  50.    return 0;
  51. }

阅读(3143) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~