c++快速xml访问违反一定的时间后(visual studio 2013)
C++ rapidxml access violation after a certain amount of time (visual studio 2013)
我一直在使用优秀的rapidxml库来读取和使用XML文件中的信息,以保存我用c++编程的游戏的过场动画信息。我遇到了一个奇怪的问题,
我首先将XML文件从std::ifstream* XMLFile加载到rapidxml::xmldocument<>*
std::stringstream buffer; //Create a string buffer to hold the loaded information
buffer << XMLFile->rdbuf(); //Pass the ifstream buffer to the string buffer
XMLFile->close(); //close the ifstream
std::string content(buffer.str()); //get the buffer as a string
buffer.clear();
cutScene = new rapidxml::xml_document<>;
cutScene->parse<0>(&content[0]);
root = cutScene->first_node();
我的过场动画xml文件是由"零件"组成的,一开始我想把所有这些零件(都是xml_nodes)加载到一个矢量
//Load parts
if (parts->size() == 0) {
rapidxml::xml_node<>* partNode = root->first_node("part");
parts->push_back(partNode);
for (int i = 1; i < numParts; i++) {
parts->push_back(partNode->next_sibling());
printf("name of part added at %i: %s.n", i, parts->at(i)->name());
}
}
最后一行将"part name of part added at 1: part"打印到控制台。问题是出于某种原因,每当我尝试访问向量并打印相同特定部分的相同名称时,而不是作为此方法的一部分,该名称可以访问,但只是字母和数字的随机字符串。似乎由于某种原因,在我的加载方法完成后,rapidxml删除了所有内容。我仍然是新的张贴在stackoverflow所以如果你需要更多的信息只是问,谢谢!
Rapidxml是原位xml解析器。它改变原始字符串缓冲区(在您的例子中是content
),以格式化以空结尾的令牌,如元素和属性名。其次,通过xml_document (currscene
)实例定义parts
项引用的树节点的生命周期。
将currscene
和content
实例与矢量保持在一起,这也将使矢量项保持活动。例句:
struct SceneData
{
std::vector<char> content;
rapidxml::xml_document<> cutScene;
std::vector<rapidxml::xml_node<>*> parts;
bool Parse(const std::string& text);
};
bool SendData::Parse(const std::string& text)
{
content.reserve(text.length() + 1);
content.assign(text.begin(), text.end());
content.push_back(' ');
parts.clear();
try
{
cutScene.parse<0>(content.data());
}
catch(rapidxml::parse_error & err)
{
return false;
}
// Load parts.
rapidxml::xml_node<>* root = cutScene.first_node();
rapidxml::xml_node<>* partNode = root->first_node("part");
parts->push_back(partNode);
for (int i = 1; i < numParts; i++) {
parts->push_back(partNode->next_sibling());
//printf("name of part added at %i: %s.n", i, parts->at(i)->name());
}
return true ;
}
解析器期望以' 结尾的字符序列作为输入。由于&string[0]引用的缓冲区不能保证以null结束,因此建议将字符串内容复制到std::vector<char>
中。
相关文章:
- 如何在Visual Studio中的库编译时间中获取链接器错误
- 计算Visual Studio 2017中AES/CCM的时间加密
- 在Visual Studio Enterprise 2017(C )中测量功能执行时间
- 如何在Visual Studio中设置C /C代码仅在一个线程中运行以测试运行时间
- Visual Studio C 枚举需要很长时间来编译
- 如何找出在Visual Studio中编译C++标头需要多少时间
- Visual Studio 2012慢速编译时间
- Visual Studio 2012编译时间
- 如何减少 Visual Studio 非托管代码中的发布生成时间
- 如何在Visual studio C++中检查函数运行时间
- 使用Visual Studio 2010的win32和x64之间的生成时间差异很大
- .cpp Visual Studio 2012中编译时间跟踪
- 从CC.Net记录VC++9(Visual Studio 2008)中的项目生成时间
- 在c++ Visual Studio 2015社区中获取本地时间
- visual c++时间限制不工作
- Visual 2013 插件,用于记录您在项目上工作的时间。
- CUDA Visual Profiler 5.0 不会生成时间线,Eror with Cudadevicereset()
- 在Visual c++ 2010中使用大型静态数组时编译时间长
- 一段时间不使用 Visual C++ 后" "缺少必需的文件
- c++快速xml访问违反一定的时间后(visual studio 2013)