我正在使用cocos2d-x和C ++开发游戏,我需要为此应用程序加载一堆YAML文件。我尝试使用yaml-cpp库,效果非常好。
问题是这个库似乎非常不稳定(至少在iOS上的cocos2d-x下),因为几乎20%的时间它无法加载相同的YAML文件,导致“未找到地图的结尾”,“无效map元素“,或者像这些错误。
我按照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文件的内容,但我可以提供一些信息:
value
是整数,浮点数或字符串我用来阅读它的代码,在那里发布,它始终采用该形式,我不会修改它以使应用程序正确运行。这只是应用程序启动和工作或启动而不起作用。由于我在中间没有任何改变,我真的不明白发生了什么。
答案 0 :(得分:1)
对解决方案有点难以猜测,因为你不会提供一个实际的例子,但是:
谁拥有unsigned char*
返回的getFileData
数据?如果该函数本身拥有数据,则在函数返回后它不再有效,因此可能会发生各种疯狂的事情。
要验证此处发生了什么(除了查看getFileData
的实现之外),您可以在调用is.string()
之前打印YAML::Parser parser(is);
并查看是否打印出预期的YAML。