【问题标题】:How to convert QByteArray to std::istream or std::ifstream?如何将 QByteArray 转换为 std::istream 或 std::ifstream?
【发布时间】:2019-02-28 15:50:43
【问题描述】:

我想在运行时从QByteArray 创建istream,而不在QByteArray 的内存中保存物理文件。

我发现有很多方法可以做相反的转换,即istreamQByteArray,但不是这个。

如何做到这一点?

【问题讨论】:

  • 如果你使用带有过滤 I/O 流的 Boost,这相当“简单”,而且“简单”,大约有 200 多行代码和相当难以阅读的文档。另一种选择是从头开始编写自己的过滤 istream,这也是一个完整的 PITA(我自己已经做过很多次了,IO 流必须是 C++ 标准中最糟糕的部分)。通过重载 operator<<operator>> 将重载从 QByteArray 写入 istream 和 ostream 会更容易。

标签: c++ qt std istream qbytearray


【解决方案1】:

通过std::istringstreamQByteArray 阅读似乎很容易:

testQByteArray-istream.cc:

#include <iostream>
#include <sstream>
#include <QtCore>

int main()
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  // make a QByteArray
  QByteArray data("Hello Qt World.");
  // convert to std::string
  std::istringstream in(data.toStdString());
  // read from istringstream
  for (;;) {
    std::string buffer;
    if (!std::getline(in, buffer)) break;
    std::cout << "Got: '" << buffer << "'\n";
  }
  // done
  return 0;
}

testQByteArray-istream.pro:

SOURCES = testQByteArray-istream.cc

QT = core

cygwin64上编译和测试:

$ qmake-qt5 testQByteArray-istream.pro

$ make

$ ./testQByteArray-istream 
Qt Version: 5.9.4
Got: 'Hello Qt World.'

$

完成。停下,等等!

无需在内存中保存物理文件

我不太确定如何阅读。大概意思是

不复制保存在QByteArray中的数据

我只看到两个解决方案:

  1. 使用QDataStream 而不是std::stream。根据文档。 QDataStream::QDataStream(const QByteArray &amp;a)

    构造一个对字节数组a进行操作的只读数据流。

    这听起来非常保证数据不会被复制。

  2. DIY。创建一个从std::stream 派生的类,该类可以从QByteArray 读取而无需复制。

关于 2. 选项,我找到了 Dietmar Kühl 对 SO: Creating an input stream from constant memory 的回答。将它应用到上面的示例中,它看起来像这样:

#include <iostream>
#include <QtCore>

// borrowed from https://stackoverflow.com/a/13059195/7478597
struct membuf: std::streambuf {
  membuf(char const* base, size_t size) {
    char* p(const_cast<char*>(base));
    this->setg(p, p, p + size);
  }
};
struct imemstream: virtual membuf, std::istream {
  imemstream(char const *base, size_t size):
    membuf(base, size),
    std::istream(static_cast<std::streambuf*>(this)) {
  }
};

int main()
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  // make a QByteArray
  QByteArray data("Hello Qt World.");  
  imemstream in(data.data(), (size_t)data.size());
  // read from istringstream
  for (;;) {
    std::string buffer;
    if (!std::getline(in, buffer)) break;
    std::cout << "Got: '" << buffer << "'\n";
  }
  // done
  return 0;
}

cygwin64上再次编译测试:

$ qmake-qt5 testQByteArray-istream.pro

$ make

$ ./testQByteArray-istream 
Qt Version: 5.9.4
Got: 'Hello Qt World.'

$

【讨论】:

  • 谢谢...我需要时间来解决这个问题..让你知道
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
  • 2015-09-15
  • 2021-04-12
  • 2018-03-29
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
相关资源
最近更新 更多