2014-12-20 3 views
0
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; 


} 

Идея:TinyXML не может сравнить Атрибут для полукокса

Итак, я хочу хранить информацию о предпочтении человека, если он хочет для игры, чтобы быть в полноэкранном режиме или оконными. Я создал эту функцию bool, которая проверяет, есть ли файл «videoSettings.xml» и возвращает информацию о предпочтениях пользователей. Если файл не существует, он будет создан при установке Fullscreen в 0 (что в основном означает, что игра будет окончена, и пользователь может изменить ее позже в настройках игры).

Часть, которая не работает:

if(*(fullscreen->Attribute("Fullscreen: ")) == '0') 
    return false; 

После добавления этого две строки я получил ошибку сегментации (ядро сбрасывали).

Кажется, что это значение хранится как символ.

EDIT: Эти линии решают все :).

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

Вы уверены, что сначала ваш код попадает в первый случай? Сначала попробуйте NULL case, затем попробуйте это, если случай – Thellimist

+0

@ user140345: рад, что это помогло. Одна вещь, чтобы быть осторожным, хотя - если атрибут «fullscreen» не существует в вашем XML-документе, вызов атрибута «Атрибут» вернет значение null. Вы бы разыменовали nullptr в свой тест 'if (* child-> Attribute ...'), не забудьте проверить результат 'Attribute()', чтобы убедиться, что он действительный указатель перед разыменованием его для значения. – frasnian

ответ

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, 

Когда вы прошлись документ иерархии, где бы ни находился ваш элемент «Окно», используйте TiXmlElement::Attribute() или TiXmlElement::QueryAttribute(), чтобы получить значение атрибута (если оно существует).

Лучше использовать иерархию с помощью FirstChild/NextSibling и т. Д. (Унаследованный TiXmlElement от TiXmlNode), вероятно, использовать ручки. См. Документы для TinyXML, связанные с TiXmlHandle - на главной странице документов есть пример, который довольно прост.

В качестве примечания стороны следует удалять двоеточие после имени атрибута в вашем опубликованном коде (то есть "fullscreen", а не "Fullscreen:").

Кроме того, эта линия:

fullscreen->Attribute("Fullscreen: "); 

прямо после вызова LinkEndChild() ничего не делает.

+0

Oh , Я понимаю. Знаете ли вы, может быть, если есть что-то, что получит атрибут из файла? – user140345

+0

Спасибо, я решил! – user140345

+0

Я забыл удалить эту строку в полноэкранном режиме -> Атрибут («Полноэкранный режим:»); Когда я задал вопрос здесь. Я знаю, что ничего не делает. :) – user140345

Смежные вопросы