中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c++怎么讀寫yaml配置文件

發布時間:2023-04-07 17:10:32 來源:億速云 閱讀:133 作者:iii 欄目:開發技術

這篇文章主要介紹“c++怎么讀寫yaml配置文件”,在日常操作中,相信很多人在c++怎么讀寫yaml配置文件問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”c++怎么讀寫yaml配置文件”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    YAML基礎語法

    YAML所表示的YAML Ain’t Markup Language,YAML 是一種簡潔的非標記語言。YAML以數據為中心,使用空白,縮進,分行組織數據,從而使得表示更加簡潔易讀。

    基本規則

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

    三種數據結構

    map,散列表

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

    # YAML表示
    age : 12
    name : huang
     
    # 對應的Json表示
    {'age':12,'name':'huang'}
    list,數組

    使用連字符(-)表示:

    # YAML表示
    - a
    - b
    - 12
    # 對應Json表示
    ['a','b',12]

    也可以寫在一行:

    # YAML表示
    [a,b,c]
     
    # 對應Json表示
    [ 'a', 'b', 'c' ]
    scalar,純量

    數據最小的單位,不可以再分割。

    數據結構嵌套

    map和list的元素可以是另一個map或者list或者是純量。由此出現4種常見的數據嵌套:

    map嵌套map
    # YAML表示
    websites:
     YAML: yaml.org 
     Ruby: ruby-lang.org 
     Python: python.org 
     Perl: use.perl.org 
    # 對應Json表示
    { websites: 
       { YAML: 'yaml.org',
         Ruby: 'ruby-lang.org',
         Python: 'python.org',
         Perl: 'use.perl.org' } }
    map嵌套list
    # YAML表示
    languages:
     - Ruby
     - Perl
     - Python 
     - c
    # 對應Json表示
    { languages: [ 'Ruby', 'Perl', 'Python', 'c' ] }
    list嵌套list
    # YAML表示
    -
      - Ruby
      - Perl
      - Python 
    - 
      - c
      - c++
      - java
    # 對應Json表示
    [ [ 'Ruby', 'Perl', 'Python' ], [ 'c', 'c++', 'java' ] ]

    除此以外,還可以如下表示該結構

    # 方法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
     
    # 對應Json表示
    [ { id: 1, name: 'huang' }, { id: 2, name: 'liao' } ]

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

    yaml-cpp 是一個開源庫

    yaml-cpp 是通過 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,
    c++怎么讀寫yaml配置文件

    將庫文件拷貝到系統默認的 lib 文件就好了,比如 ubuntu 是 /usr/local/lib。
    c++怎么讀寫yaml配置文件

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

    讀取 yaml 配置文件

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

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

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

    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 編譯,因為我習慣用 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)#庫文件路徑

    在當前目錄創建 build 文件夾,然后進入 build 文件執行 cmake 操作。

    mkdir buildcd buildcmake ..

    最終生成了名為 yamltest 的可執行文件。

    執行后,輸出的信息如下。

    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()表示將解析的內容轉換成 string 類型。
    你也可以轉換成其它類型。

    它是一個模板方法。

    有同學可能會有疑惑。

    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 中的內容。

    比如,訪問 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() 判斷迭代器是否結束。

    NodeType

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

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

    對應未定義、空、標量、序列、字典。

    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。

    結果如下:

     Type: 3
     Type: 2
     Type: 4

    分別對應 Sequence、Scalar、Map。

    yaml-cpp 寫配置文件

    日常開發中,除了讀取配置參數,我們經常需要保存參數,yaml-cpp 自然也提供了相應的功能。

    ofstream fout("testconfig.xml");
    
    config["score"] = 99;
    
    fout << config;
    
    fout.close();

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

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

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

    到此,yaml-cpp 的簡單使用就 OK 了,讀者可以查看代碼去深入學習。
    完整代碼:
    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;
    
    }

    到此,關于“c++怎么讀寫yaml配置文件”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    邢台市| 六安市| 黑山县| 南江县| 克东县| 安塞县| 孙吴县| 鄱阳县| 金坛市| 泰州市| 内黄县| 冷水江市| 雅安市| 海口市| 福建省| 芜湖市| 江源县| 昭苏县| 廊坊市| 城口县| 石狮市| 定结县| 邵阳县| 和田县| 襄垣县| 大荔县| 奉新县| 铜梁县| 沙湾县| 清河县| 安徽省| 景德镇市| 丘北县| 贞丰县| 葵青区| 莫力| 永胜县| 罗山县| 长春市| 四子王旗| 康乐县|