最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++ 讀寫yaml配置文件

 更新時間:2023年04月07日 11:10:51   作者:小魚兒飛呀飛  
YAML所表示的YAML Ain’t Markup Language,YAML 是一種簡潔的非標記語言,這篇文章主要介紹了在C語言開發(fā)中如何讀寫配置yaml配置文件,感興趣的同學(xué)可以參考一下

YAML基礎(chǔ)語法

YAML所表示的YAML Ain’t Markup Language,YAML 是一種簡潔的非標記語言。YAML以數(shù)據(jù)為中心,使用空白,縮進,分行組織數(shù)據(jù),從而使得表示更加簡潔易讀。
一邊學(xué)習(xí)規(guī)則一邊可以在在線Demo這個YAML轉(zhuǎn)化JSON網(wǎng)頁中進行上手練習(xí)

基本規(guī)則

YAML有以下基本規(guī)則:
1、大小寫敏感
2、使用縮進表示層級關(guān)系
3、禁止使用tab縮進,只能使用空格鍵
4、縮進長度沒有限制,只要元素對齊就表示這些元素屬于一個層級。
5、使用#表示注釋
6、字符串可以不用引號標注

三種數(shù)據(jù)結(jié)構(gòu)

map,散列表

使用冒號(:)表示鍵值對,同一縮進的所有鍵值對屬于一個map,示例:

# YAML表示
age : 12
name : huang
 
# 對應(yīng)的Json表示
{'age':12,'name':'huang'}

list,數(shù)組

使用連字符(-)表示:

# YAML表示
- a
- b
- 12
# 對應(yīng)Json表示
['a','b',12]

也可以寫在一行:

# YAML表示
[a,b,c]
 
# 對應(yīng)Json表示
[ 'a', 'b', 'c' ]

scalar,純量

數(shù)據(jù)最小的單位,不可以再分割。

數(shù)據(jù)結(jié)構(gòu)嵌套

map和list的元素可以是另一個map或者list或者是純量。由此出現(xiàn)4種常見的數(shù)據(jù)嵌套:

map嵌套map

# YAML表示
websites:
 YAML: yaml.org 
 Ruby: ruby-lang.org 
 Python: python.org 
 Perl: use.perl.org 
# 對應(yīng)Json表示
{ websites: 
   { YAML: 'yaml.org',
     Ruby: 'ruby-lang.org',
     Python: 'python.org',
     Perl: 'use.perl.org' } }

map嵌套list

# YAML表示
languages:
 - Ruby
 - Perl
 - Python 
 - c
# 對應(yīng)Json表示
{ languages: [ 'Ruby', 'Perl', 'Python', 'c' ] }

list嵌套list

# YAML表示
-
  - Ruby
  - Perl
  - Python 
- 
  - c
  - c++
  - java
# 對應(yīng)Json表示
[ [ 'Ruby', 'Perl', 'Python' ], [ 'c', 'c++', 'java' ] ]

除此以外,還可以如下表示該結(jié)構(gòu)

# 方法2
- - Ruby
  - Perl
  - Python 
- - c
  - c++
  - java
# 方法3
- [Ruby,Perl,Python]
- [c,c++,java]

list嵌套map

# YAML表示
-
  id: 1
  name: huang
-
  id: 2
  name: liao
 
# 對應(yīng)Json表示
[ { id: 1, name: 'huang' }, { id: 2, name: 'liao' } ]

利用yaml-cpp讀寫yaml配置文件

yaml-cpp 是一個開源庫,地址在 github 上,https://github.com/jbeder/yaml-cpp

yaml-cpp 是通過 CMake 來進行構(gòu)建和編譯的。

首先下載源碼

然后,在源碼目錄創(chuàng)建一個 build 文件夾。

mkdir build

進入到 build 文件夾,然后執(zhí)行 cmake 命令。

cd build
cmake ..

注意的是 cmake 后面是 …,這代表從 build 上一層目錄查找 CMakeLists.txt ,然后編譯的文件都會存放在 build 文件夾,如果對編譯的效果不滿意,只要刪除 build 文件就好了,其他源碼目錄并不受影響,這是 cmake 編譯時的基本套路。

yaml-cpp 默認構(gòu)建的就是靜態(tài)庫,也就是 unix 類系統(tǒng)下的 .a 文件,如果你想構(gòu)建動態(tài)庫的話,就需要在 cmake 時指定。

cmake .. -D BUILD_SHARED_LIBS=ON

編譯成功后,會生成庫文件,你只需要將庫文件和頭文件拷貝到你自己的工程當(dāng)中,就可以使用了。

需要處理好頭文件。

你如果不想每次都到 copy 頭文件到不同的工程中,那么你可以將頭文件 copy 到系統(tǒng)默認的頭文件目錄,比如 ubuntu 的地址是 /usr/local/include,
在這里插入圖片描述

將庫文件拷貝到系統(tǒng)默認的 lib 文件就好了,比如 ubuntu 是 /usr/local/lib。
在這里插入圖片描述

有了頭文件和庫,我們就可以順利寫代碼了。

讀取 yaml 配置文件

假如我們有這樣一個配置文件
config.yaml

name: frank
sex: male
age: 18

skills: 
  c++: 1
  java: 1
  android: 1
  python: 1

溫馨提示:yaml 中的內(nèi)容,:后面一定要加空格哦
現(xiàn)在,我們的目標是要把它正確的讀取出來。

yaml_test.cpp

#include <iostream>
#include "include/yaml-cpp/yaml.h"

using namespace std;

int main(int argc,char** argv)
{
    YAML::Node config = YAML::LoadFile("../config.yaml");

    cout << "name:" << config["name"].as<string>() << endl;
    cout << "sex:" << config["sex"].as<string>() << endl;
    cout << "age:" << config["age"].as<int>() << endl;
    return 0;
}

頭文件在/usr/local/include目錄下
庫文件在/usr/local/lib目錄下
然后通過 cmake 編譯,因為我習(xí)慣用 cmake,如果讀者喜歡用原始的 g++ 編譯或者 makefile 也是可以的。

我的 CMakeFileLists.txt 如下:

cmake_minimum_required(VERSION 3.2)

project(yaml_test)

add_definitions(-std=c++11)
#set(CMAKE_CXX_STANDARD 11)

include_directories(/usr/local/include/yaml-cpp)#頭文件路徑
set(SRCS src/yaml_test.cpp)
add_executable(yamltest ${SRCS})

target_link_libraries(yamltest /usr/local/lib/libyaml-cpp.so)#庫文件路徑

在當(dāng)前目錄創(chuàng)建 build 文件夾,然后進入 build 文件執(zhí)行 cmake 操作。

mkdir buildcd buildcmake ..

最終生成了名為 yamltest 的可執(zhí)行文件。

執(zhí)行后,輸出的信息如下。

name:frank
sex:male
age:18

Node

Node 是 yaml-cpp 中的核心概念,它用于存儲解析后的 yaml 信息。

生成 Node 的形式有很多種, loadFile() 是最常見的一種。

Node LoadFile(const std::string& filename)

filename 就是配置文件的路徑。

有了 Node 之后,所有的信息都可以檢索到。

比如 name.

cout << "name:" << config["name"].as<string>() << endl;

as()表示將解析的內(nèi)容轉(zhuǎn)換成 string 類型。
你也可以轉(zhuǎn)換成其它類型。

它是一個模板方法。

有同學(xué)可能會有疑惑。

skills:  
  c++: 1
  java: 1
  android: 1
  python: 1

skills 的信息怎么讀呢?

其實也非常簡單。

cout << "skills c++:" << config["skills"]["c++"].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;

yaml-cpp 中的迭代

yaml-cpp 中也可以通過迭代的方式,訪問 Node 中的內(nèi)容。

比如,訪問 skills 下面的各個元素。

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

用 begin() 獲取迭代器,用 end() 判斷迭代器是否結(jié)束。

NodeType

yaml 支持 Scalar、List、Map 類型,yaml-cpp 通過 NodeType 定義了 Node 的可能類型

namespace YAML {
struct NodeType {
  enum value { Undefined, Null, Scalar, Sequence, Map };
};
}

對應(yīng)未定義、空、標量、序列、字典。

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;

上面的代碼是為了判斷 NodeType。

結(jié)果如下:

 Type: 3
 Type: 2
 Type: 4

分別對應(yīng) Sequence、Scalar、Map。

yaml-cpp 寫配置文件

日常開發(fā)中,除了讀取配置參數(shù),我們經(jīng)常需要保存參數(shù),yaml-cpp 自然也提供了相應(yīng)的功能。

ofstream fout("testconfig.xml");

config["score"] = 99;

fout << config;

fout.close();

前面代碼解析成功的 config,現(xiàn)在添加一個 score,然后保存。

運行代碼后,發(fā)現(xiàn) build 文件夾下正確保存了 testconfig.xml 文件,score 被正確添加進去了。

name: frank
sex: male
age: 18
skills:
  c++: 1
  java: 1
  android: 1
  python: 1
score: 99

到此,yaml-cpp 的簡單使用就 OK 了,讀者可以查看代碼去深入學(xué)習(xí)。
完整代碼:
yaml_test.cpp

#include <iostream>
#include <fstream>
#include <yaml-cpp/yaml.h>

using namespace std;

int main(int argc,char ** argv)
{
    YAML::Node config = YAML::LoadFile("../config/config.yaml");

    cout<<"Nod Type"<<config.Type()<<endl;
    cout<<"skills type" <<config["skills"].Type()<<endl;

    cout<<"name:"<<config["name"].as<string>()<<endl;
    cout<<"sex:"<<config["sex"].as<string>()<<endl;
    cout<<"age"<<config["age"].as<int>()<<endl;

    cout<<"skills c++:"<<config["skills"]["c++"].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("../config/testconfig.yaml");

    config["score"] = 99;

    fout << config;

    fout.close();

    return 0;

}

到此這篇關(guān)于c++ 開發(fā)中讀寫yaml配置文件的文章就介紹到這了,更多相關(guān)c++ 開發(fā)中讀寫yaml配置文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言如何正確的終止正在運行的子線程

    C語言如何正確的終止正在運行的子線程

    這篇文章主要介紹了C語言如何正確的終止正在運行的子線程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • 詳解VS2019使用scanf()函數(shù)報錯的解決方法

    詳解VS2019使用scanf()函數(shù)報錯的解決方法

    本文主要介紹了詳解VS2019使用scanf()函數(shù)報錯的解決方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語言中#pragma預(yù)處理指令的使用

    C語言中#pragma預(yù)處理指令的使用

    在所有的預(yù)處理指令中,#pragma指令可能是最復(fù)雜的了,它的作用是設(shè)定編譯器的狀態(tài)或者是指示編譯器完成一些特定的動作,本文主要介紹了C語言中#pragma預(yù)處理指令的使用,感興趣的可以了解一下
    2023-12-12
  • C++程序自動重啟的實現(xiàn)代碼

    C++程序自動重啟的實現(xiàn)代碼

    自動重啟原理很簡單,用一個進程監(jiān)控另一個進程,掛了就再啟動一個,細節(jié)也不算多,主要是正確判斷進程狀態(tài)和啟動方式,本文就給大家講講C++程序自動重啟的實現(xiàn)方法,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下
    2024-04-04
  • C語言判斷數(shù)是否為素數(shù)與素數(shù)輸出

    C語言判斷數(shù)是否為素數(shù)與素數(shù)輸出

    大家好,本篇文章主要講的是C語言判斷數(shù)是否為素數(shù)與素數(shù)輸出,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C++ 類模板、函數(shù)模板全特化、偏特化的使用

    C++ 類模板、函數(shù)模板全特化、偏特化的使用

    這篇文章主要介紹了C++ 類模板、函數(shù)模板全特化、偏特化的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • C語言簡明清晰講解結(jié)構(gòu)體

    C語言簡明清晰講解結(jié)構(gòu)體

    C語言結(jié)構(gòu)體(Struct)從本質(zhì)上講是一種自定義的數(shù)據(jù)類型,只不過這種數(shù)據(jù)類型比較復(fù)雜,是由 int、char、float 等基本類型組成的。你可以認為結(jié)構(gòu)體是一種聚合類型
    2022-05-05
  • 關(guān)于C語言文件操作方法

    關(guān)于C語言文件操作方法

    這篇文章主要介紹了關(guān)于C語言文件操作方法的相關(guān)資料,需要的朋友可以參考下
    2018-03-03
  • C++學(xué)習(xí)之異常機制詳解

    C++學(xué)習(xí)之異常機制詳解

    C++中的異常處理機制可以幫助我們處理程序在運行時可能會遇到的異常情況,比如內(nèi)存分配錯誤、文件打開失敗等。本文就和大家詳細講講C++中異常機制的具體使用吧
    2023-04-04
  • c++內(nèi)聯(lián)函數(shù)(inline)使用詳解

    c++內(nèi)聯(lián)函數(shù)(inline)使用詳解

    這篇文章主要介紹了c++內(nèi)聯(lián)函數(shù)(inline)使用詳解,需要的朋友可以參考下
    2014-04-04

最新評論

新田县| 舒城县| 梨树县| 丹凤县| 颍上县| 杭州市| 湖南省| 新昌县| 常宁市| 巩留县| 息烽县| 惠东县| 房山区| 礼泉县| 临高县| 陇南市| 洛川县| 镇巴县| 咸宁市| 大新县| 莆田市| 新邵县| 辽宁省| 阜宁县| 中宁县| 焦作市| 婺源县| 南陵县| 镇康县| 南康市| 黄大仙区| 武功县| 西峡县| 叶城县| 皋兰县| 安达市| 涿鹿县| 迭部县| 辽宁省| 黑河市| 江都市|