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