【C++】4.工具:读取yaml配置信息

news2025/1/11 7:37:49

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍读取yaml配置信息。
学其所用,用其所学。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. yaml介绍
    • :blush:2. yaml-cpp库安装
    • :satisfied:3. yaml读取示例
      • 读取yaml
      • 读取string和vector

😏1. yaml介绍

YAML(YAML Ain’t Markup Language)是一种简单可读的数据序列化格式。它是一种简洁和易于理解的语言,用于表示数据结构和配置信息。YAML最初是为了在不同编程语言之间交换数据而设计的,但它也被广泛用于配置文件、日志文件以及其他需要结构化数据的地方。

YAML采用了一种基于缩进的语法来表示数据的层次结构。它使用空格缩进来表示层级关系,而不是像XML或JSON那样使用特殊的标记符号。这使得YAML文件在视觉上更具可读性,并且可以使用普通文本编辑器进行编辑。

YAML还支持一些高级特性,如引用、包含外部文件、多行字符串等。它的灵活性使得它成为许多应用程序中处理配置文件和数据交换的首选格式。

😊2. yaml-cpp库安装

Github仓库:https://github.com/jbeder/yaml-cpp

Tutorial:https://github.com/jbeder/yaml-cpp/wiki/Tutorial

安装编译:

git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp
mkdir build && cd build
cmake ..
make
make test
sudo make install

yaml-cpp 默认构建的就是静态库,也就是 unix 类系统下的 .a 文件。

😆3. yaml读取示例

读取yaml

尝试打开读取yaml示例如下:

// main.cpp
#include <yaml-cpp/yaml.h> //yaml-cpp 头文件
#include <iostream>

int main(int argc, char** argv) {
    try {
        YAML::Node node = YAML::LoadFile("file.yml");
        std::cout << node << std::endl; //输出yaml数据
    } catch (...) { //文件为非yaml格式抛出异常
        std::cout << "error" << std::endl;
    }
    return 0;
}

读取string和vector

新建config.yaml配置文件:

custom_db:
    db_domain: 10.0.1.1
    db_username: root
    db_passwd: my_passwd
    db_schema: test

redis:
    redis_domain: 10.0.1.2
    redis_passwd: 123456

hello:
    num_config: [yaml-test]
    name_config: [powered, by, yaml-test]

读取代码示例:

// main.cpp
#include <iostream>
#include <string>
#include <stdio.h>
#include <unistd.h>
#include <vector>
#include <yaml-cpp/yaml.h>

// read config
const std::string DB_CONF = "config.yaml";

int main(int argc, char *argv[]) {
    /*----------------------------------- test yaml-cpp ----------------------------------------*/
    std::cout << "This code is for test yaml" << std::endl;

    /* Node conf. */
    YAML::Node conf = YAML::LoadFile(DB_CONF);
    
    /*----------------------------------- display db_config ----------------------------------------*/
    std::cout << "Database:"<< std::endl;
    std::cout << "domain:  " << conf["custom_db"]["db_domain"].as<std::string>() << std::endl;
    std::cout << "username:" << conf["custom_db"]["db_username"].as<std::string>() << std::endl;
    std::cout << "passwd:  " << conf["custom_db"]["db_passwd"].as<std::string>() << std::endl;
    std::cout << "schema:  " << conf["custom_db"]["db_schema"].as<std::string>() << std::endl;

    /*----------------------------------- display redis ----------------------------------------*/
    std::cout << "Redis" << std::endl;
    std::cout << "redis_domain: " << conf["redis"]["redis_domain"].as<std::string>() << std::endl;
    std::cout << "redis_passwd: " << conf["redis"]["redis_passwd"].as<std::string>() << std::endl;
    
    /*----------------------------------- display hello ----------------------------------------*/
    /* vector of name string. */
    std::vector<std::string> name_vec = conf["hello"]["num_config"].as<std::vector<std::string> >();
    if(!name_vec.empty())
      std::cout << name_vec[0] << std::endl;
    std::vector<std::string> name_vec2 = conf["hello"]["name_config"].as<std::vector<std::string> >();
    if(!name_vec2.empty())
    {
      for (int i = 0; i < name_vec2.size(); i++)
      {
        std::cout << name_vec2[i] << " ";
      }
      std::cout << std::endl;
    }

    return 0;
}

编译:g++ main.cpp -lyaml-cpp

结果如下:

This code is for test yaml
Database:
domain:  10.0.1.1
username:root
passwd:  my_passwd
schema:  test
Redis
redis_domain: 10.0.1.2
redis_passwd: 123456
yaml-test
powered by yaml-test

在这里插入图片描述

以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/717125.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web学习1--maven--项目管理工具

写在前面&#xff1a; 这学期搞主攻算法去了&#xff0c;web的知识都快忘了。开始复习学习了。 文章目录 maven介绍功能介绍maven安装jar包搜索仓库 pom文件项目介绍父工程依赖管理属性控制可选依赖构建 依赖管理依赖的传递排除依赖可选依赖 maven生命周期分模块开发模块聚合…

产品的帮助中心怎么建设?关于帮助文档的7个小技巧

用户使用产品的过程中&#xff0c;常常会遇到与产品使用相关的问题。这时候&#xff0c;用户通常会面临三个选择&#xff1a;1.寻找客服的帮助 2.阅读产品帮助文档 3.放弃使用产品。 显然&#xff0c;对于企业而言&#xff0c;当然是希望能够帮助用户解决问题&#xff0c;使其…

shiro入门

1、概述 Apache Shiro 是一个功能强大且易于使用的 Java 安全(权限)框架。借助 Shiro 您可以快速轻松地保护任何应用程序一一从最小的移动应用程序到最大的 Web 和企业应用程序。 作用&#xff1a;Shiro可以帮我们完成 &#xff1a;认证、授权、加密、会话管理、与 Web 集成、…

车载通信,来看看SOA架构通信如何跨系统的

SOA车载跨系统通信 在车载系统中实现跨系统通信时&#xff0c;SOA架构&#xff08;Service-Oriented Architecture&#xff0c;面向服务的架构&#xff09;可以提供一种有效的解决方案。以下是一种基于SOA的车载跨系统通信的概述&#xff1a; 定义服务接口&#xff1a;首先&a…

2023年无线蓝牙耳机排行榜,十款无线蓝牙耳机品牌推荐

蓝牙耳机作为现代生活必备的电子产品之一&#xff0c;我们在选购时的选择就显得尤为重要。随着各大科技公司对蓝牙耳机功能的不断完善&#xff0c;用户对于耳机的期望也越来越高&#xff0c;音质、性能、降噪、舒适度等方面都成为了用户选择蓝牙耳机时考虑的因素。接下来我们一…

从零开始 Spring Boot 57:JPA中的一对多关系

从零开始 Spring Boot 57&#xff1a;JPA中的一对多关系 图源&#xff1a;简书 (jianshu.com) 在上篇文章中我们介绍了如何在 JPA 中实现实体的一对一关系&#xff0c;在关系型数据库设计中&#xff0c;除了一对一关系&#xff0c;还存在一对多关系。本篇文章介绍如何在 JPA 中…

Android仿淘宝、京东、拼多多搜索历史

详情见代码 &#xff1a;https://github.com/yixiaolunhui/FSearchHistory

计算机网络概述(一)

因特网概述 网络&#xff0c;互联网与因特网的区别联系&#xff1a; 以上是使用有线和无线链路连接的两个网络。那么&#xff0c;要让这两个网络连接起来&#xff0c;就需要路由器。若干个网络通过多个路由器互联起来&#xff0c;就称为了互联网。 因特网是当今世界上最大的互…

基于springboot+vue的高校二手交易系统(源代码+数据库)080

基于springbootvue的高校二手交易系统(源代码数据库)080 一、系统介绍 本项目前后端分离 本系统分为管理员、用户两种角色 用户角色包含以下功能&#xff1a; 登录、注册、(商品搜索、发布、收藏、下单)、评论、个人信息修改、密码修改、我的发布、我的订单、收藏夹 管理…

使用android studio将网站打包成apk(可以直接使用替换为自己的网站连接即可)

公司有这个需求生成一个webapp应用。前面一直在使用web与Android混合开发&#xff0c;越是后面你就发现越有意思。hbuildX官网不怎么维护&#xff0c;虽然一直说这是潮流&#xff0c;uni-app开发也挺火的&#xff0c;但是安卓开发特别是适配不同的手机型号&#xff0c;真的是头…

详解JS 作用域与作用域链、IIFE模式、js执行过程

文章目录 一、什么是作用域二. 全局作用域、函数作用域、块级作用域全局作用域函数作用域注意 if、for循环、while循环变量 块级作用域 二、什么是作用域链1. 什么是自由变量2.什么是作用域链3. 关于自由变量的取值 三、IIFE模式由来语法基本语法带参 四、JavaScript 执行过程编…

C++ 数据结构B 树

目录 1. 常见的搜索结构 2. B树概念 3. B-树的插入分析 4. B-树的插入实现 4.1 B-树的节点设计 4.2 插入key的过程 4.4 B-树的简单验证 4.5 B-树的性能分析 4.6 B-树的删除 5. B树和B*树 5.1 B树 5.2 B*树 5.3 总结 6. B-树的应用 6.1 索引 6.2 MySQL索引简介 6…

浅谈建筑项目中的智能照明系统的设计

张心志 安科瑞电气股份有限公司 上海嘉定 201801 【摘要】&#xff1a;建筑智能照明工程中智能照明控制系统发展迅速&#xff0c;具有舒适性和节能性两方面优势。智能照明控制系统已经处于模块化高速发展阶段&#xff0c;如今更好的控制方案成为制约系统发展的瓶颈。文章在研…

工作总是忙不完是什么原因?时间管理软件帮你解决问题

随着市场竞争的激烈&#xff0c;有不少上班族都感受到了工作的压力&#xff0c;每天越来越多的工作任务需要完成。于是我们经常会听到这样的抱怨&#xff1a;“工作太多了&#xff0c;总是忙不完&#xff01;”那么工作总是忙不完是什么原因呢&#xff1f;其实一般来说工作总是…

GB50255-2014电气装置安装工程电力变流设备施工及验收规范

为了保证电力变流设备安装工程的施工质量&#xff0c;促进施工技术的提高&#xff0c;保证电力变流设备的安全稳定运行&#xff0c;制定本规范。 本规范适用于电力系统中除高压直流输电和柔性交流输电以外的电力变换设备的施工、调试及验收。 电力变流设备的施工、调试及验收…

linux epoll/select使用区分和实例对比

Linux内核poll&#xff0c;ppoll&#xff0c;epoll&#xff0c;select代码位置&#xff1a; poll&#xff0c;ppoll&#xff0c;select相关内核实现在在fs/select.c中; epoll_ctl和epoll_wait相关函数在fs/eventpoll.c中 epoll实测不支持监听普通文件&#xff0c;select可以…

医院中医临床护理中医理论考试题库及答案

本题库是根据最新考试大纲要求&#xff0c;结合近年来考试真题的重难点进行汇编整理组成的全真模拟试题&#xff0c;考生们可以进行专项训练&#xff0c;查漏补缺巩固知识点。本题库对热点考题和重难点题目都进行了仔细的整理和编辑&#xff0c;相信考生在经过了针对性的刷题练…

测试员拒绝当“背锅侠”,软件质量不是“测”出来的!

以前有个朋友跟我说&#xff1a;做测试这行就是在隐忍中负重前行。因为测试是软件发布前的最后一个环节&#xff0c;被称作质量出口儿&#xff0c;测试环节之前所有未做好的工作所带来的不良后果&#xff0c;似乎都能被轻松甩锅给测试人员。软件一旦出现问题&#xff0c;我们经…

django疫情防控常态化下疫情物资管理可视化系统-计算机毕设 附源码73893

django疫情防控常态化下疫情物资管理可视化系统 摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。…

YOLOv5改进系列(13)——更换激活函数之SiLU,ReLU,ELU,Hardswish,Mish,Softplus,AconC系列等

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制