-1

我正在使用 cocos2d-x 和 C++ 开发游戏,我需要为此应用程序加载一堆 YAML 文件。我尝试使用yaml-cpp库,结果非常好。

问题是这个库似乎非常不稳定(至少在 iOS 上的 cocos2d-x 下),因为几乎 20% 的时间它无法加载相同的 YAML 文件并抛出“未找到地图结尾”、“无效地图元素” ,或类似的错误。

我遵循了HowToParseADocument指南,所以我认为我做对了。但是,由于它不是 100% 可靠的,我正在寻找更稳定的东西。例如:

long size = 0;
unsigned char *yaml = FileUtils::getInstance()->getFileData("file.yml", "r", &size);
std::stringstream is;
is << yaml;

YAML::Parser parser(is);
YAML::Node doc;
while(parser.GetNextDocument(doc)) {
  instance->settings = doc.Clone();
}

解析器通常会在parser.GetNextDocument(doc)调用时中断。我要阅读的文档是简单的 YAML,其中包含key: value以下简单形式的列表:

# Comment
section1:
  param1: value1
  param2: value2

# Comment
section2:
  param1: value1
  param2: value2

编辑

我不允许透露原始 YAML 文件的内容,但我可以给你一些信息:

  1. 它仅包含映射,而不包含数组、别名或其他特定结构
  2. 那些values 是整数、浮点数或字符串
  3. 它已经用这个免费的工具进行了检查,并取得了成功。

我曾经阅读过的代码,贴在那里,它总是以那种形式出现,我不会修改它以使应用程序正确运行。只是应用程序启动并工作或启动但不工作。由于我中间什么都没改变,我真的不明白发生了什么。

4

1 回答 1

1

解决方案有点难以猜测,因为您不会提供实际示例,但是:

谁拥有unsigned char*返回的数据getFileData?如果该函数本身拥有数据,那么在函数返回后它不再有效,因此可能会发生各种疯狂的事情。

要验证这里发生了什么(除了查看 的实现getFileData),您可以is.string()在调用之前打印出来YAML::Parser parser(is);,看看是否打印出预期的 YAML。

于 2013-11-26T15:01:23.843 回答