如何将QByteArray转换为std :: istream或std :: ifstream?

时间:2018-09-25 05:24:20

标签: c++ qt std istream qbytearray

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

我发现有很多方法可以进行相反的转换,即从istreamQByteArray,但是没有这种方法。

如何实现?

1 个答案:

答案 0 :(得分:4)

通过std::istringstream的{​​{1}}进行阅读似乎很容易:

QByteArray

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

已在cygwin64上进行了编译和测试:

SOURCES = testQByteArray-istream.cc

QT = core

完成。停下来,等等!

  

不将物理文件保存在内存中

我不太确定该怎么读。可能是

不复制保存在$ qmake-qt5 testQByteArray-istream.pro $ make $ ./testQByteArray-istream Qt Version: 5.9.4 Got: 'Hello Qt World.' $ 中的数据

我只看到两种解决方案:

  1. 使用QByteArray代替QDataStream。根据文件。 QDataStream::QDataStream(const QByteArray &a)

      

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

    听起来非常承诺不会复制数据。

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

关于2.选项,我发现DietmarKühl对SO: Creating an input stream from constant memory的回答。将其应用于上面的示例,它看起来像这样:

QByteArray

已在cygwin64上进行编译并再次测试:

#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;
}