2014-12-20 10 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은 문자에 속성 비교할 어차피

그래서, 내가 사람의 취향에 대한 정보를 저장 싶어. "videoSettings.xml"파일이 있는지 확인하고 사용자 기본 설정에 대한 정보를 반환하는이 bool 함수를 만들었습니다. 파일이 존재하지 않으면 Fullscreen을 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. 그것은 아무것도 초기화하기 전에 fullscreen를 사용하는

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; 

:

+0

첫 번째 경우에는 코드가 먼저 입력해야합니까? 먼저 NULL 사례를 시도한 다음이 경우를 시도하십시오. – Thellimist

+0

@ user140345 : 도움이 되었으면 좋겠습니다. 한 가지주의해야 할 점은, XML 문서에 "fullscreen"속성이 없다면, 'Attribute'를 호출하면 null이 반환된다는 것입니다. 당신은'if (* child-> Attribute ...'테스트에서 nullptr를 참조 해제 할 것입니다. 값을 역 참조하기 전에'Attribute()'의 결과를 테스트하여 반드시 올바른 포인터인지 확인하십시오. – frasnian

답변

1

코드는 다음이있다. 편집 에

코멘트에서 질문에 대한 응답 :

문서를로드하는 것은 성공하면, 당신은 같은과 루트 요소를 얻을 필요가 : 문서를 걸어 때

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에서 계승 한 것)을 사용하여 계층 구조를 걷는 것보다 더 나은 방법은 아마도 핸들을 사용하는 것입니다. TiXmlHandle과 관련된 TinyXML 문서보기 - 주요 문서 페이지에는 매우 간단한 예가 있습니다.

덧글로 게시 된 코드의 속성 이름 뒤에 콜론 (예 : "fullscreen"이 아닌 "Fullscreen:")을 제거해야합니다. 또한

,이 라인 :

fullscreen->Attribute("Fullscreen: "); 

당신이 LinkEndChild() 아무것도하지 않는 전화 직후.

+0

오 , 나는 그것을 얻는다. 파일에서 속성을 얻을 수있는 것이 있다면 어쩌면 알고 있는가? – user140345

+0

고마워, 해결 했어! – user140345

+0

이 줄을 삭제하는 것을 잊었습니다. 전체 화면 -> 속성 ("전체 화면 :"); 여기에서 질문을 올렸습니다. 나는 그것이 아무것도하지 않는다는 것을 안다. :) – user140345