使用 yaml-cpp 解析 yaml 文件

问题描述

我在使用 yaml 解析 yaml-cpp 文件时遇到问题,我正在使用 wxWidgets 创建一个应用程序并且我正在尝试从 {{1 }} 文件看起来像,

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()

解决方法

由于 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"),有关详细信息,请参阅 the manual

,

在跨平台环境下,最好保存窗口的客户端大小,对于GTK来说,重要的是客户端大小。可能还有其他操作系统/工具包属于这种情况。