TinyXML无法将Attribute与char进行比较

时间:2014-12-20 22:47:31

标签: c++ segmentation-fault coredump tinyxml

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。

1 个答案:

答案 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等(通过TiXmlElementTiXmlNode继承)继续使用层次结构更好的方法可能是使用句柄。请参阅与TiXmlHandle相关的TinyXML文档 - 主文档页面有一个非常简单的示例。

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

此外,这一行:

fullscreen->Attribute("Fullscreen: ");
在你致电LinkEndChild()之后

没有做任何事情。