std::istream
からwxXmlDocument
をロードしたいと思いますが、wxWidget
が標準入出力ストリームを使用してコンパイルされていても、残念ながら、Load(std::istream&)
メンバー関数はありません。std :: istreamからwxXmlDocumentをロードするには?
私はwxWidgets 3.1.0をmacOSで使用しています。
std::istream
からwxXmlDocument
をロードしたいと思いますが、wxWidget
が標準入出力ストリームを使用してコンパイルされていても、残念ながら、Load(std::istream&)
メンバー関数はありません。std :: istreamからwxXmlDocumentをロードするには?
私はwxWidgets 3.1.0をmacOSで使用しています。
私はwxXmlDocument
がLoad(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);
}
そして答えは私にもよく見えます。なぜか、それがなぜ落とされたのかを知ることは面白いでしょう。 –
この解決策の問題は、 'std :: istream :: read'が' eof'に遭遇したとき 'setstate(failbit | eofbit)'になることです。場合によっては 'wxDocument :: LoadObject'の間に' myStdInputStreamAdapter'を使って 'wxXmlDocument'をロードすると、ストリームは失敗状態になり、クリアしない限り' wxLogError'を取得します。より良い方法がありますか? – roberti42
'std :: istream :: peak'と' std :: istream :: readsome'を呼び出すことで修正しました。今私は 'wxInputStream :: OnSysRead' [documentation](http://docs.wxwidgets.org/3.1.0/classwx_input_stream.html#a8ebacd18964a4b169a62ad9190cab4d5)に従って' m_lasterror'を設定しました。 – roberti42
これがなぜ落とされたのか分かりませんが、質問は私にはうまく見えます。少なくとも、0にアップしてください。 –