TinyXML无法将属性与字符进行比较

TinyXML cant compare Attribute to the char

本文关键字:字符 比较 属性 TinyXML      更新时间:2023-10-16
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 等(由 TiXmlElementTiXmlNode 继承(遍历层次结构更好的方法可能是使用句柄。 请参阅与TiXmlHandle相关的TinyXML文档 - 主文档页面有一个非常简单的示例。

作为旁注,应删除已发布代码中属性名称后面的冒号(即 "fullscreen",而不是"Fullscreen:"(。

另外,这一行:

fullscreen->Attribute("Fullscreen: ");

在您调用LinkEndChild()后立即执行任何操作。