c++ - 如何将 QByteArray 转换为 std::istream 或 std::ifstream?
问题描述
我想在运行时创建istream
,QByteArray
而不将物理文件保存在QByteArray
.
我发现有很多方法可以进行相反的转换,即istream
to QByteArray
,但不是这个。
如何做到这一点?
解决方案
阅读std::istringstream
fromQByteArray
似乎很容易:
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
我只看到两个解决方案:
使用 a
QDataStream
而不是std::stream
. 根据文档。QDataStream::QDataStream(const QByteArray &a)
构造一个对字节数组 a 进行操作的只读数据流。
这听起来很有希望,数据不会被复制。
DIY。创建一个派生类,该类
std::stream
可以从 a 中读取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.'
$
推荐阅读
- oracle - 重复给定数量的字符串并在 oracle 中计数
- python - 当我尝试从列表中删除一个字符串时它不起作用
- python - 为什么这个函数不返回 f pd.DataFrames?Python
- wpf - WPF如何做这个缩进?
- javascript - MutationObserver - 得到“TypeError: MutationObserver.observe: Argument 1 does not implement interface Node.”
- simulation - 如何使用 selectOutput 块创建多个卸货码头?
- amazon-web-services - 在 AWS Lambda 层中使用自定义 nodejs 函数
- python - SQLAlchemy 中的线程安全引擎和连接
- python - 从具有相同长度的数组的字典中创建数据框
- flutter - 我的应用栏上方的这个额外空间是什么?