Я разрабатываю игру, используя cocos2d-x и C ++, и мне нужно загрузить кучу YAML-файлов для этого приложения. Я пытался использовать YAML-каст библиотека с неплохими результатами.
Проблема заключается в том, что эта библиотека кажется очень нестабильной (по крайней мере, под cocos2d-x на iOS), так как почти 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, но я могу дать вам некоторую информацию:
value
s целые числа, числа с плавающей запятой или строкиКод, который я использовал для его прочтения, размещен там, он всегда в той форме, и я не изменяю его, чтобы приложение работало правильно. Просто приложение запускается и работает или запускается и не работает. Поскольку я ничего не меняю в середине, я действительно не понимаю, что происходит.
Сложно догадаться о решении, потому что вы не предоставите реальный пример, но:
Кто владеет данными на unsigned char*
вернулся getFileData
? Если эта функция сама владеет данными, то она больше не действительна после того, как функция вернется, и поэтому могут произойти всякие сумасшедшие вещи.
Чтобы проверить, что здесь происходит (кроме рассмотрения реализации getFileData
), вы могли бы распечатать is.string()
перед звонком YAML::Parser parser(is);
и посмотрите, печатает ли это ожидаемый YAML.
Других решений пока нет …