C++使用yaml-cpp庫(kù)操作YAML的示例代碼
1. YAML 入門教程
基本語(yǔ)法
- 大小寫敏感
- 使用縮進(jìn)表示層級(jí)關(guān)系
- 縮進(jìn)不允許使用tab,只允許空格
- 縮進(jìn)的空格數(shù)不重要,只要相同層級(jí)的元素左對(duì)齊即可
- '#'表示注釋
數(shù)據(jù)類型
YAML 支持以下幾種數(shù)據(jù)類型:
- 對(duì)象:鍵值對(duì)的集合,又稱為映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 數(shù)組:一組按次序排列的值,又稱為序列(sequence) / 列表(list)
- 純量(scalars):?jiǎn)蝹€(gè)的、不可再分的值
YAML 對(duì)象
對(duì)象鍵值對(duì)使用冒號(hào)結(jié)構(gòu)表示 key: value,冒號(hào)后面要加一個(gè)空格。
也可以使用 key:{key1: value1, key2: value2, ...}。
還可以使用縮進(jìn)表示層級(jí)關(guān)系;
key: child-key: value child-key2: value2
較為復(fù)雜的對(duì)象格式,可以使用問(wèn)號(hào)加一個(gè)空格代表一個(gè)復(fù)雜的 key,配合一個(gè)冒號(hào)加一個(gè)空格代表一個(gè) value:
? - complexkey1 - complexkey2 : - complexvalue1 - complexvalue2
意思即對(duì)象的屬性是一個(gè)數(shù)組 [complexkey1,complexkey2],對(duì)應(yīng)的值也是一個(gè)數(shù)組 [complexvalue1,complexvalue2]
YAML 數(shù)組
以 - 開(kāi)頭的行表示構(gòu)成一個(gè)數(shù)組:
- A - B - C
YAML 支持多維數(shù)組,可以使用行內(nèi)表示:
key: [value1, value2, ...]
數(shù)據(jù)結(jié)構(gòu)的子成員是一個(gè)數(shù)組,則可以在該項(xiàng)下面縮進(jìn)一個(gè)空格。
- - A - B - C
一個(gè)相對(duì)復(fù)雜的例子:
companies: - id: 1 name: company1 price: 200W - id: 2 name: company2 price: 500W
意思是 companies 屬性是一個(gè)數(shù)組,每一個(gè)數(shù)組元素又是由 id、name、price 三個(gè)屬性構(gòu)成。
數(shù)組也可以使用流式(flow)的方式表示:
companies: [{id: 1,name: company1,price: 200W},{id: 2,name: company2,price: 500W}]
復(fù)合結(jié)構(gòu)
數(shù)組和對(duì)象可以構(gòu)成復(fù)合結(jié)構(gòu),例:
languages: - Ruby - Perl - Python websites: YAML: yaml.org Ruby: ruby-lang.org Python: python.org Perl: use.perl.org
轉(zhuǎn)換為 json 為:
{ languages: [ 'Ruby', 'Perl', 'Python'], websites: { YAML: 'yaml.org', Ruby: 'ruby-lang.org', Python: 'python.org', Perl: 'use.perl.org' } }
純量
純量是最基本的,不可再分的值,包括:
- 字符串
- 布爾值
- 整數(shù)
- 浮點(diǎn)數(shù)
- Null
- 時(shí)間
- 日期
使用一個(gè)例子來(lái)快速了解純量的基本使用:
boolean: - TRUE #true,True都可以 - FALSE #false,F(xiàn)alse都可以 float: - 3.14 - 6.8523015e+5 #可以使用科學(xué)計(jì)數(shù)法 int: - 123 - 0b1010_0111_0100_1010_1110 #二進(jìn)制表示 null: nodeName: 'node' parent: ~ #使用~表示null string: - 哈哈 - 'Hello world' #可以使用雙引號(hào)或者單引號(hào)包裹特殊字符 - newline newline2 #字符串可以拆成多行,每一行會(huì)被轉(zhuǎn)化成一個(gè)空格 date: - 2018-02-17 #日期必須使用ISO 8601格式,即yyyy-MM-dd datetime: - 2018-02-17T15:02:31+08:00 #時(shí)間使用ISO 8601格式,時(shí)間和日期之間使用T連接,最后使用+代表時(shí)區(qū)
引用
& 錨點(diǎn)和 * 別名,可以用來(lái)引用:
defaults: &defaults adapter: postgres host: localhost development: database: myapp_development <<: *defaults test: database: myapp_test <<: *defaults
相當(dāng)于:
defaults: adapter: postgres host: localhost development: database: myapp_development adapter: postgres host: localhost test: database: myapp_test adapter: postgres host: localhost
& 用來(lái)建立錨點(diǎn)(defaults),<< 表示合并到當(dāng)前數(shù)據(jù),* 用來(lái)引用錨點(diǎn)。
下面是另一個(gè)例子:
- &showell Steve - Clark - Brian - Oren - *showell
轉(zhuǎn)為 JavaScript 代碼如下:
[ 'Steve', 'Clark', 'Brian', 'Oren', 'Steve' ]
2. 安裝yaml-cpp庫(kù)
yaml-cpp 是一個(gè)開(kāi)源庫(kù), 在github上: https://github.com/jbeder/yaml-cpp . Github上有安裝說(shuō)明,y用戶可以選擇從源代碼編譯安裝,或者使用包管理器進(jìn)行安裝。
1.從源碼安裝:
mkdir build cd build cmake ..
yaml-cpp 默認(rèn)構(gòu)建的就是靜態(tài)庫(kù),也就是 unix 類系統(tǒng)下的 .a 文件,如果你想構(gòu)建動(dòng)態(tài)庫(kù)的話,就需要在 cmake 時(shí)指定:
cmake .. -D BUILD_SHARED_LIBS=ON
編譯成功后,會(huì)生成庫(kù)文件,你只需要將庫(kù)文件和頭文件拷貝到你自己的工程當(dāng)中,就可以使用了。
如果不想每次都 copy 頭文件到不同的工程中,可以將頭文件 copy 到系統(tǒng)默認(rèn)目錄。比如 ubuntu 的地址是 /usr/local/include,將庫(kù)文件拷貝到系統(tǒng)默認(rèn)的 lib 文件就好了,比如 ubuntu 是 /usr/local/lib。
有了頭文件和庫(kù),就可以順利寫代碼了。
2.使用 APT 命令安裝:
sudo apt install libyaml-cpp-dev
3. 生成 YAML 示例
1. yaml文件格式
name: John age: 25 hobbies: - reading - coding
2.C++代碼
#include <iostream> #include <fstream> #include <yaml-cpp/yaml.h> // g++ -o yaml_example yaml_sample_gen.cpp -lyaml-cpp int main() { // 創(chuàng)建YAML節(jié)點(diǎn) YAML::Node config; config["name"] = "John"; config["age"] = 25; config["hobbies"].push_back("reading"); config["hobbies"].push_back("coding"); // 寫入YAML文件 std::ofstream fout("output.yaml"); fout << config; fout.close(); return 0; }
在上面的示例中,我們首先創(chuàng)建了一個(gè)YAML節(jié)點(diǎn),并將數(shù)據(jù)填充到節(jié)點(diǎn)中。然后,我們使用<<
運(yùn)算符將YAML節(jié)點(diǎn)寫入output.yaml
文件中。
3.g++編譯命令
g++ -o yaml_example yaml_sample_gen.cpp -lyaml-cpp
4.CMakeList 進(jìn)行編譯
cmake_minimum_required(VERSION 3.5) # 項(xiàng)目名稱 project(YamlExample) # 設(shè)置 C++ 標(biāo)準(zhǔn) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 查找 yaml-cpp 庫(kù) find_package(yaml-cpp REQUIRED) # 包含 yaml-cpp 頭文件 include_directories(${YAML_CPP_INCLUDE_DIR}) # 添加可執(zhí)行文件 add_executable(yaml_example main.cpp) # 鏈接 yaml-cpp 庫(kù) target_link_libraries(yaml_example ${YAML_CPP_LIBRARIES})
以上就是C++使用yaml-cpp庫(kù)操作YAML的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C++ yaml-cpp操作YAML的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++實(shí)現(xiàn)選擇性排序(SelectionSort)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)選擇性排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04C 創(chuàng)建鏈表并將信息存儲(chǔ)在二進(jìn)制文件中讀取的實(shí)例代碼
C 創(chuàng)建鏈表并將信息存儲(chǔ)在二進(jìn)制文件中讀取的實(shí)例代碼,需要的朋友可以參考一下2013-03-03QT使用udp實(shí)現(xiàn)發(fā)送與接收?qǐng)D片
這篇文章主要為大家詳細(xì)介紹了QT如何使用udp協(xié)議實(shí)現(xiàn)發(fā)送與接收?qǐng)D片功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12詳解如何在C/C++中測(cè)量一個(gè)函數(shù)或功能的運(yùn)行時(shí)間
本文算是一個(gè)比較完整的關(guān)于在 C/C++ 中測(cè)量一個(gè)函數(shù)或者功能的總結(jié),最后會(huì)演示三種方法的對(duì)比,文章通過(guò)代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12C++實(shí)現(xiàn)LeetCode(768.可排序的最大塊數(shù)之二)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(768.可排序的最大塊數(shù)之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C語(yǔ)言中獲取文件狀態(tài)的相關(guān)函數(shù)小結(jié)
這篇文章主要介紹了C語(yǔ)言中獲取文件狀態(tài)的相關(guān)函數(shù)小結(jié),包括stat()函數(shù)和fstat()函數(shù)以及l(fā)stat()函數(shù)的使用,需要的朋友可以參考下2015-09-09