2017-04-30 6 views
2

std::istream에서 wxXmlDocument을로드하고 싶습니다. wxWidget이 표준 입/출력 스트림을 사용하여 컴파일 되더라도, 불행히도 Load(std::istream&) 멤버 함수가 없습니다.std :: istream에서 wxXmlDocument를로드하는 방법은 무엇입니까?

가치있는 점은 MacOS에서 wxWidgets 3.1.0을 사용하고 있다는 것입니다.

+1

왜 이것이 downvoted되었는지 확실하지 않은 질문은 나에게 완벽하게 좋은 것처럼 보입니다. 적어도 0으로 다시 upvoted. –

답변

2

내가 wxXmlDocumentLoad(wxInputStream&)을 제공하기 때문에, 솔루션이 같은 어댑터 정의 할 수 있습니다, 대안이 있는지 모르겠지만 : XML을로드

class myStdInputStreamAdapter : public wxInputStream { 
public: 
    myStdInputStreamAdapter(std::istream &s): stream{s} {} 

protected: 
    std::istream &stream; 

    virtual size_t OnSysRead(void *buffer, size_t bufsize) { 
    std::streamsize size = 0; 

    stream.peek(); 

    if (stream.fail() || stream.bad()) { 
     m_lasterror = wxSTREAM_READ_ERROR; 
    } else if (stream.eof()) { 
     m_lasterror = wxSTREAM_EOF; 
    } else { 
     size = stream.readsome(static_cast<std::istream::char_type *>(buffer), 
          bufsize); 
    } 

    return size; 
    } 
}; 

을 그리고 그것을 사용 :

void f(std::istream &istream) { 
    wxXmlDocument xml; 

    myStdInputStreamAdapter inputStreamAdapter(istream); 

    xml.Load(inputStreamAdapter); 
} 
+1

그리고 그 대답은 나에게도 좋을 것입니다. 다시 한번, 왜 그것이 뉘앙스가 내려 졌는지를 아는 것은 흥미로울 것입니다. –

+0

이 솔루션의 문제점은'std :: istream :: read'가'eof'를 만나면'setstate (failbit | eofbit)'입니다. 예를 들어,'wxDocument :: LoadObject' 중에'myStdInputStreamAdapter'를 사용하여'wxXmlDocument'를로드한다면, 스트림은 실패 상태가되고, 당신이 그것을 지우지 않으면'wxLogError'를 얻습니다. 더 좋은 방법이 있습니까? – roberti42

+0

'std :: istream :: peak'와'std :: istream :: readsome'을 호출하여 문제를 해결했습니다; 이제'wxInputStream :: OnSysRead' [documentation] (http://docs.wxwidgets.org/3.1.0/classwx_input_stream.html#a8ebacd18964a4b169a62ad9190cab4d5)에 따라'm_lasterror '를 설정했습니다. – roberti42