簡體   English   中英

使用 yaml-cpp 解析 yaml 文件

[英]Parsing yaml files with yaml-cpp

我在使用yaml-cpp解析yaml文件時遇到問題,我正在使用wxWidgets制作應用程序,我正在嘗試從yaml文件中讀取幀大小,看起來像,

---
This is the configuration file for the Sample Browser,
feel free to edit this file as needed
...

Window:
  SizeW: 1280
  SizeH: 720
Media:
  Autoplay: false

這是應該處理解析的代碼,

    int sizeH, sizeW;

    try
    {
        YAML::Node config = YAML::LoadFile("/home/apoorv/repos/cpp-projects/wxWidgets/SampleBrowser/build/config.yaml");

        if (!config["Window"])
        {
            wxLogDebug("Error! Cannot fetch values.");
        }

        sizeH = config["SizeH"].as<int>();
        sizeW = config["SizeW"].as<int>();
    }

    catch(const YAML::ParserException& ex)
    {
        std::cout << ex.what() << std::endl;
    }

    this->SetSize(sizeW, sizeH);

但是當我嘗試解析這個文件並設置幀大小this->SetSize()時,它會出錯,說*** Caught unhandled unknown exception; terminating *** Caught unhandled unknown exception; terminating

由於SizeHSizeWWindow的孩子,你的兩行應該看起來像

    sizeH = config["Window"]["SizeH"].as<int>();
    sizeW = config["Window"]["SizeW"].as<int>();

或者,與之前的檢查合並,

    if (auto window = config["Window"]) {
        sizeH = window["SizeH"].as<int>();
        sizeW = window["SizeW"].as<int>();
    } else {
        wxLogDebug("Error! Cannot fetch values.");
    }

通常,錯誤處理很糟糕。 在您的代碼中,如果遇到錯誤,未設置sizeHsizeW但仍將其提供給SetSize 這是未定義的行為。 您應該使用一些默認值初始化它們,例如

int sizeH = 480, sizeW = 640;

此外,由於您讓我們this是什么一無所知,因此可能存在其他錯誤。

嘗試這樣做來學習 yaml-cpp 很好,但如果你真的想保存/恢復你的框架幾何,你應該使用wxPersistentTLW代替。 要使用它,只需在創建框架后調用wxPersistentRegisterAndRestore(frame, "NameToIdentifyYourFrame") ,有關詳細信息,請參閱手冊

在跨平台環境下最好保存window的客戶端大小,至於GTK重要的是客戶端大小。 在這種情況下,可能還有其他操作系統/工具包。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM