C++使用yaml配置文件

讀取config.yaml文件中參數內容,並賦值給程序中相關參數。

 

如果不存在key,會報錯:

terminate called after throwing an instance of 'YAML::TypedBadConversion<int>'

  what():  yaml-cpp: error at line 0, column 0: bad conversion

已放棄 (核心已轉儲)

 

示例:

yaml_test.cpp

#include <iostream>
#include "yaml-cpp/yaml.h"
#include <fstream>
 
using namespace std;
 
typedef struct
{
  int cpp;
  int java;
  int android;
  int python;

}Skills;


typedef struct
{
    string name;
    string sex;
    int age;
    Skills skills;

} Config;



int test_base()
{
    YAML::Node config;
    try{
         config = YAML::LoadFile("../config.yaml");
    }catch(YAML::BadFile &e){
        std::cout<<"read error!"<<std::endl;
        return -1;
    }
    
    cout << "Node type " << config.Type() << endl;
    cout << "skills type " << config["skills"].Type() << endl;
 
    //可以用string類型作爲下表,讀取參數
    string age = "age";
    cout << "age when string is label:" << config[age].as<int>() << endl;
 
    cout << "name:" << config["name"].as<string>() << endl;
    cout << "sex:" << config["sex"].as<string>() << endl;
    cout << "age:" << config["age"].as<int>() << endl;
 
    //讀取不存在的node值,報YAML::TypedBadConversion異常
    try{
        string label = config["label"].as<string>();
    }catch(YAML::TypedBadConversion<string> &e){
        std::cout<<"label node is NULL"<<std::endl;
    }//TypedBadConversion是模板類,讀取什麼類型的參數就傳入什麼類型
 
 
    cout << "skills cpp:" << config["skills"]["cpp"].as<int>() << endl;
    cout << "skills java:" << config["skills"]["java"].as<int>() << endl;
    cout << "skills android:" << config["skills"]["android"].as<int>() << endl;
    cout << "skills python:" << config["skills"]["python"].as<int>() << endl;
 
    for(YAML::const_iterator it= config["skills"].begin(); it != config["skills"].end();++it)
    {
        cout << it->first.as<string>() << ":" << it->second.as<int>() << endl;
    }
 
    YAML::Node test1 = YAML::Load("[1,2,3,4]");
    cout << " Type: " << test1.Type() << endl;
 
    YAML::Node test2 = YAML::Load("1");
    cout << " Type: " << test2.Type() << endl;
 
    YAML::Node test3 = YAML::Load("{'id':1,'degree':'senior'}");
    cout << " Type: " << test3.Type() << endl;
 
    ofstream fout("./testconfig.yaml"); //保存config爲yaml文件
 
    config["score"] = 99;//添加新元素
 
    fout << config;
 
    fout.close();
 
    return 0;
}



int use_yaml_config()
{
    YAML::Node config;
    try{
         config = YAML::LoadFile("../config.yaml");
    }catch(YAML::BadFile &e){
        std::cout<<"read error!"<<std::endl;
        return -1;
    }

    Config param;


    //提取, 賦值
    param.age = config["age"].as<int>();
    param.name = config["name"].as<string>();
    param.sex = config["sex"].as<string>();

    param.skills.android = config["skills"]["android"].as<int>();
    param.skills.java = config["skills"]["java"].as<int>();
    param.skills.python = config["skills"]["python"].as<int>();
    param.skills.cpp = config["skills"]["cpp"].as<int>();


    //查看結果
    cout<< " param.age = "<<param.age <<endl;
    cout<< " param.name = "<<param.name <<endl;
    cout<< " param.sex = "<<param.sex <<endl;

    cout<< "param.skills.android = "<<param.skills.android <<endl;
    cout<< " param.skills.java = "<<param.skills.java <<endl;
    cout<< " param.skills.python = "<<param.skills.python <<endl;
    cout<< " param.skills.cpp = "<<param.skills.cpp <<endl;

    return 0;
}



int main(int argc,char** argv)
{

    use_yaml_config();

    return 0;
}

config.yaml

name: frank
sex: male
age: 18

skills: 
  cpp: 1
  java: 2
  android: 3
  python: 4

CMakeLists.txt 配置


cmake_minimum_required(VERSION 3.2)

project(yaml_test)

add_definitions(-std=c++11)


if(NEW_YAMLCPP_FOUND)
add_definitions(-DHAVE_NEW_YAMLCPP)
endif(NEW_YAMLCPP_FOUND)
 

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

set(SRCS ./src/yaml_test.cpp)

add_executable(yamltest ${SRCS})
target_link_libraries(yamltest ${catkin_LIBRARIES} yaml-cpp)



執行結果:

yuan@linx-c:~/VSCode/CPP_Learning/yaml/yaml_test/build$ ./yamltest 
 param.age = 18
 param.name = frank
 param.sex = male
param.skills.android = 3
 param.skills.java = 2
 param.skills.python = 4
 param.skills.cpp = 1

參考:

C++ 解析yaml文件的使用方法 https://blog.csdn.net/sunlin972913894/article/details/103038082

c++ 開發中利用yaml-cpp讀寫yaml配置文件 https://blog.csdn.net/briblue/article/details/89515470

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章