2017-04-30 1 views
2

std::istreamからwxXmlDocumentをロードしたいと思いますが、wxWidgetが標準入出力ストリームを使用してコンパイルされていても、残念ながら、Load(std::istream&)メンバー関数はありません。std :: istreamからwxXmlDocumentをロードするには?

私はwxWidgets 3.1.0をmacOSで使用しています。

+1

これがなぜ落とされたのか分かりませんが、質問は私にはうまく見えます。少なくとも、0にアップしてください。 –

答えて

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

関連する問題