bool win::checkIfFScreen(sf::RenderWindow &window)
{
TiXmlDocument doc;
TiXmlElement * fullscreen;
if(!doc.LoadFile("videoSettings.xml"))
{
fullscreen = new TiXmlElement( "Window" );
fullscreen->SetAttribute("Fullscreen: ", 0);
doc.LinkEndChild( fullscreen );
fullscreen->Attribute("Fullscreen: ");
std::cout << typeid(*fullscreen->Attribute("Fullscreen: ")).name() << std::endl;
doc.SaveFile("videoSettings.xml");
return false;
}
if(*(fullscreen->Attribute("Fullscreen: ")) == '0')
return false;
return true;
}
点子:
所以,如果他想让游戏全屏或加窗,我想存储有关人物偏好的信息。我创建了这个bool函数来检查是否有&#34; videoSettings.xml&#34;文件并返回有关用户首选项的信息。如果文件不存在,则将全屏设置为0创建(这基本上意味着游戏将被加窗,用户可以在游戏设置的后期更改)。
不起作用的部分:
if(*(fullscreen->Attribute("Fullscreen: ")) == '0')
return false;
添加这两行后,我发现了分段错误(核心转储)。
似乎该值存储为char。
编辑: 这条线解决了一切:)。
TiXmlHandle docHandle ( &doc );
TiXmlElement *child = docHandle.FirstChild( "Window" ).ToElement();
if(child)
if(*child->Attribute("fullscreen") == '1')
return true;
else if(*child->Attribute("fullscreen") == '0')
return false;
谢谢你@frasnian。
答案 0 :(得分:1)
您的代码有:
TiXmlElement * fullscreen; // not initialized to anything here
if(!doc.LoadFile("videoSettings.xml")) // LoadFile returns true on success
{
fullscreen = new TiXmlElement( "Window" ); // okay
...
return false;
}
// question: if doc.LoadFile() succeeds, what is this going to do-
if(*(fullscreen->Attribute("Fullscreen: ")) == '0')
return false;
在使用fullscreen
进行初始化之前,您正在使用它。
编辑 回答评论中的问题:
如果加载文档成功,则需要使用以下内容获取根元素:
TiXmlElement* root = doc.FirstChildElement("Whatever"); // root element name
if (root){
TiXmlElement* el = root->FirstChildElement("Window"); // etc, etc,
当您将文档层次结构移动到“Window”元素所在的位置时,请使用TiXmlElement::Attribute()
或TiXmlElement::QueryAttribute()
获取属性的值(如果存在)。
比使用FirstChild / NextSibling等(通过TiXmlElement
从TiXmlNode
继承)继续使用层次结构更好的方法可能是使用句柄。请参阅与TiXmlHandle
相关的TinyXML文档 - 主文档页面有一个非常简单的示例。
作为旁注,应删除发布代码中属性名称后的冒号(即"fullscreen"
,而不是"Fullscreen:"
)。
此外,这一行:
fullscreen->Attribute("Fullscreen: ");
在你致电LinkEndChild()
之后没有做任何事情。