C/C++编程:利用yaml-cpp读写yaml配置文件

1060 篇文章 297 订阅

yaml-cpp 是一个开源库,地址在 github 上,https://github.com/jbeder/yaml-cpp

yaml-cpp 是通过 CMake 来进行构建和编译的。所以你的系统中必须先安装了cmake

准备

首先下载源码。

然后,在源码目录创建一个 build 文件夹。

mkdir build

进入到 build 文件夹,然后执行 cmake 命令。

cd build

cmake ..

注意的是 cmake 后面是 …,这代表从 build 上一层目录查找 CMakeLists.txt ,然后编译的文件都会存放在 build 文件夹,如果对编译的效果不满意,只要删除 build 文件就好了,其他源码目录并不受影响,这是 cmake 编译时的基本套路。

yaml-cpp 默认构建的就是静态库,也就是 unix 类系统下的 .a 文件,如果你想构建动态库的话,就需要在 cmake 时指定。

cmake ..  -D BUILD_SHARED_LIBS=ON

编译成功后,会生成库文件,你只需要将库文件和头文件拷贝到你自己的工程当中,就可以使用了。

你如果不想每次都到 copy 头文件到不同的工程中,那么你可以将头文件 copy 到系统默认的头文件目录,比如 ubuntu 的地址是 /usr/local/include,将库文件拷贝到系统默认的 lib 文件就好了,比如 ubuntu 是 /usr/local/lib。

有了头文件和库,我们就可以顺利写代码了。

使用

示例一

在这里插入图片描述
1、CMakeLists.txt:

cmake_minimum_required(VERSION 3.16)
project(yaml_lerning)

include_directories(${PROJECT_SOURCE_DIR}/include
        ${PROJECT_SOURCE_DIR}/include/yaml-cpp)

link_directories(${PROJECT_SOURCE_DIR}/lib)

set(CMAKE_CXX_STANDARD 11)

add_executable(yaml_lerning main.cpp)

target_link_libraries( ${PROJECT_NAME} libyaml-cpp.a)

2、config.yaml

value1: true
value2: false
value3: ~
 
number1: 123
number2: !!str 123
number3: "123"
number4: !!float 123

blog:
  name: csdn
  id: fengbingchun
  url: https://blog.csdn.net/fengbingchun


github:
  - https://github.com/fengbingchun
  - NN_Test Face_Test OpenCV_Test
    Messy_Test CUDA_Test

3、main.cpp

#include <iostream>
#include "yaml.h"

using namespace std;

int main(int argc,char** argv)
{
    /*
     * Node 是 yaml-cpp 中的核心概念,它用于存储解析后的 yaml 信息。
     * 生成 Node 的形式有很多种, loadFile() 是最常见的一种。
     *    有了 Node 之后,所有的信息都可以检索到。
     * */
    YAML::Node config = YAML::LoadFile("../config.yaml");



	bool value1, value2;
	if (config["value1"])
		value1 = config["value1"].as<bool>();
	if (config["value2"])
		value2 = config["value2"].as<bool>();
 
	fprintf(stdout, "value1: %d, value2: %d\n", value1, value2);
 
	int number1;
	std::string number2, number3;
	float number4;
	if (config["number1"])
		number1 = config["number1"].as<int>();
	if (config["number2"])
		number2 = config["number2"].as<std::string>();
	if (config["number3"])
		number3 = config["number3"].as<std::string>();
	if (config["number4"])
		number4 = config["number4"].as<float>();
	fprintf(stdout, "number1: %d, number2: %s, number3: %s, number4: %f\n",
		number1, number2.c_str(), number3.c_str(), number4);


    cout << "----------------------------------------\n";
      std::string blog_name{"xxxxx"}, blog_id{"xxxxx"}, blog_url{"xxxxx"};
    if (config["blog"]) {
        if (config["blog"]["name"])
            blog_name = config["blog"]["name"].as<std::string>();
        if (config["blog"]["id"])
            blog_id = config["blog"]["id"].as<std::string>();
        if (config["blog"]["url"])
            blog_url = config["blog"]["url"].as<std::string>();

    } else {
        fprintf(stderr, "the node blog doesn't exist\n");
    }

    fprintf(stdout, "blog name: %s, id: %s, url: %s\n",
            blog_name.c_str(), blog_id.c_str(), blog_url.c_str());


    for(YAML::const_iterator it= config["blog"].begin(); it != config["blog"].end();++it)
    {
        cout << it->first.as<string>() << ":" << it->second.as<string>() << endl;
    }

   cout << "----------------------------------------\n";
    std::string github_url, github_repos;
    if (config["github"])
        github_url = config["github"][0].as<std::string>();
    github_repos = config["github"][1].as<std::string>();
    fprintf(stdout, "github url: %s, repos: %s\n", github_url.c_str(), github_repos.c_str());
    return 0;
}

在这里插入图片描述

好的,以下是一个安装 Hyperf 框架的 `yaml` 文件示例: ```yaml stages: - install - start install: stage: install image: docker:latest services: - docker:dind script: - docker run -d --name hyperf -v /mnt/hgfs/www/hyperf/:/hyperf-skeleton -p 9501:9501 -it --privileged -u root --entrypoint /bin/sh hyperf/hyperf:7.4-alpine-v3.11-swoole - docker exec -it hyperf sh -c "cd /hyperf-skeleton && composer config -g repo.packagist composer https://mirrors.aliyun.com/composer && composer create-project hyperf/hyperf-skeleton" artifacts: paths: - /mnt/hgfs/www/hyperf/hyperf-skeleton start: stage: start image: docker:latest services: - docker:dind script: - docker start hyperf - docker exec -it hyperf sh -c "cd /hyperf-skeleton && php /hyperf-skeleton/bin/hyperf.php start" ``` 这个 YAML 文件定义了两个阶段,第一个阶段为 `install`,用于在 Docker 容器中安装 Hyperf 框架及其相关依赖;第二个阶段为 `start`,用于在 Docker 容器中启动 Hyperf 框架。在 `install` 阶段中,我们使用了 `docker` 镜像,在 Docker 容器中执行了 `docker run` 命令来创建 Hyperf 容器,并执行了 `docker exec` 命令来执行安装 Hyperf 框架及其相关依赖的命令。在 `start` 阶段中,我们同样使用了 `docker` 镜像,在 Docker 容器中执行了 `docker start` 命令来启动 Hyperf 容器,并执行了 `docker exec` 命令来启动 Hyperf 框架。在 `install` 阶段中,我们还使用了 `artifacts` 关键字来指定将 Hyperf 框架所在的目录 `/mnt/hgfs/www/hyperf/hyperf-skeleton` 作为构建产物,以便在后续的阶段中使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值