【问题标题】:Parsing yaml files with yaml-cpp使用 yaml-cpp 解析 yaml 文件
【发布时间】:2021-01-31 20:36:06
【问题描述】:

我在使用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-&gt;SetSize() 时,它会出错说 *** Caught unhandled unknown exception; terminating

【问题讨论】:

    标签: c++ yaml wxwidgets yaml-cpp


    【解决方案1】:

    因为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 是什么,因此可能还有其他错误。

    【讨论】:

    • 我尝试了您在上面共享的代码,包括ifif,还初始化了int sizeWint sizeH,但我仍然遇到同样的错误。 thiswxFrame,因为我在类 MainFrame 中,它继承自 wxFrame
    • 我认为我现在遇到的问题是因为在我的yaml 文件中,前 4 行是 doc,我马上要钥匙,有没有办法忽略开头的文档,还是跳过它?因为如果我删除前 4 行,它会起作用。
    • @apoorv569 我忽略了这一点。前四行确实是另一个 YAML 文档。您需要执行 config = YAML::LoadAllFromFile("…/config.yaml")[1]; 以获取包含您的值的第二个 YAML 文档。
    • 将其从 LoadFile() 更改为 LoadAllFromFile() 会出现错误提示 No viable conversion from std::vector&lt;Node&gt; to YAML::Node。顺便说一句,这个文档一开始就像一个评论,我添加它作为一种评论,或者是别的什么。
    • @apoorv569 你最后忘记了[1]。前四行是一个 YAML 文档,以指令结束标记 (---) 开头,包含一个标量,并以文档结束标记 (...) 结尾。它们作为包含单个标量节点的 YAML 文档加载。以下内容创建了第二个 YAML 文档,这就是为什么需要使用LoadAllFromFile
    【解决方案2】:

    尝试这样做来学习 yaml-cpp 很好,但如果你真的想保存/恢复你的框架几何,你应该改用wxPersistentTLW。要使用它,只需在创建框架后调用wxPersistentRegisterAndRestore(frame, "NameToIdentifyYourFrame"),有关详细信息,请参阅the manual

    【讨论】:

    • 是的,我知道这一点,但我使用单独的yaml 文件的原因是,我希望能够存储的不仅仅是窗口大小和位置,我正在制作有点像配置文件,用户可以在其中更改有关应用程序的一些设置。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2020-10-14
      • 2018-10-13
      • 2015-12-06
      • 2015-05-14
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 2018-10-04
      • 1970-01-01
      相关资源
      最近更新 更多