如何从 std::istream 加载 wxXmlDocument?
How to load wxXmlDocument from std::istream?
我想从 std::istream
加载 wxXmlDocument
但不幸的是,没有 Load(std::istream&)
成员函数,即使 wxWidget
是使用标准 [=19] 编译的=] 流。
为了它的价值,我在 macOS 上使用 wxWidgets 3.1.0。
我不知道是否有其他选择,但是,由于 wxXmlDocument
提供了 Load(wxInputStream&)
,解决方案可以是定义这样的适配器:
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;
}
};
然后用它加载 xml:
void f(std::istream &istream) {
wxXmlDocument xml;
myStdInputStreamAdapter inputStreamAdapter(istream);
xml.Load(inputStreamAdapter);
}
我想从 std::istream
加载 wxXmlDocument
但不幸的是,没有 Load(std::istream&)
成员函数,即使 wxWidget
是使用标准 [=19] 编译的=] 流。
为了它的价值,我在 macOS 上使用 wxWidgets 3.1.0。
我不知道是否有其他选择,但是,由于 wxXmlDocument
提供了 Load(wxInputStream&)
,解决方案可以是定义这样的适配器:
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;
}
};
然后用它加载 xml:
void f(std::istream &istream) {
wxXmlDocument xml;
myStdInputStreamAdapter inputStreamAdapter(istream);
xml.Load(inputStreamAdapter);
}