如何从std :: istream加载wxXmlDocument?

时间:2017-04-30 21:02:35

标签: c++ wxwidgets

我想从wxXmlDocument加载std::istream但不幸的是,即使使用标准输入/输出流编译Load(std::istream&),也没有wxWidget成员函数。

对于它的价值,我在macOS上使用wxWidgets 3.1.0。

1 个答案:

答案 0 :(得分:1)

我不知道是否有其他选择,但由于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);
}