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;
}
想法:
因此,如果他希望游戏全屏或窗口化,我想存储有关人员偏好的信息。我创建了这个布尔函数,用于检查是否存在"videoSettings.xml"文件并返回有关用户首选项的信息。如果文件不存在,则会在全屏设置为 0 的情况下创建该文件(这基本上意味着游戏将被窗口化,用户稍后可以在游戏设置中更改它(。
不起作用的部分:
if(*(fullscreen->Attribute("Fullscreen: ")) == '0')
return false;
添加这两行后,我遇到了分段错误(核心转储(。
似乎该值存储为字符。
编辑:这条线解决了:)的一切.
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。
你的代码是这样的:
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()
后立即执行任何操作。