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

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。

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

使用

示例一

C/C++编程:利用yaml-cpp读写yaml配置文件_第1张图片
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 
#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;
}

C/C++编程:利用yaml-cpp读写yaml配置文件_第2张图片

你可能感兴趣的:(C++,c++,c语言,linux)