将 QT 资源转换为 ::std::istream&

Posted

技术标签:

【中文标题】将 QT 资源转换为 ::std::istream&【英文标题】:Convert QT Resource to ::std::istream& 【发布时间】:2019-02-25 18:12:26 【问题描述】:

我正在尝试将 QResource XML 转换为 istream。 XML 进入的第三方签名如下所示。

  ::std::unique_ptr< ::NO::Peoplefile >
  peoplefile (::std::istream& is,
         ::xml_schema::Flags f = 0,
         const ::xml_schema::Properties& p = ::xml_schema::Properties ());

但是如何将 QResource 转换为 istream?

尝试使用以下内容,但无法将其转换为::std::istream&amp;。有什么想法吗?

ifstream& QFileToifstream(QFile & file) 
    Q_ASSERT(file.isReadable());
    return ifstream(::_fdopen(file.handle(), "r")); //error: non-const lvalue reference to type 'basic_ifstream<...>' cannot bind to a temporary of type 'basic_ifstream<...>'

【问题讨论】:

【参考方案1】:

由于有问题的资源是 XML,我假设它不是很大,并且可以很容易地全部读入内存。在这种情况下,您可以简单地使用std::istringstream...

/*
 * Attempt to open the bound resource `:/some-resource.xml'.
 */
if (QFile f(":/some-resource.xml"); f.open(QIODevice::ReadOnly)) 

  /*
   * Read its contents into an std::string which is used to
   * initialize an std::istringstream.
   */
  std::istringstream is(f.readAll().toStdString());

  /*
   * Pass the istringstream as the first parameter to peoplefile.
   */
  auto result = peoplefile(is, 0/* flags */, ::xml_schema::Properties());

【讨论】:

以上是关于将 QT 资源转换为 ::std::istream&的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 std::istream_iterator 上使用的 std::find_if 似乎返回最后一个元素?

istream_iterator && istream_iteratorbuf

在没有系统调用(管道)的线程之间使用 std::istream 和 std::ostream

std::istream::get

istream_iterator 遍历二进制文件中的字节

C++ - 实现我自己的流