c++ - 通过 QTextStream 反复读写 QBuffer
问题描述
我正在尝试QBuffer
通过QTextStream
. 首先我构造两个对象:
QBuffer b;
b.open(QIODevice::ReadWrite);
QTextStream s(&b);
// Setup text stream here
然后我写了三个不同部分的信息并将它们读回:
s << "Test" << 666 << endl << flush;
s.seek(0);
qDebug() << s.readAll();
s << "X" << endl << flush;
s.seek(0);
qDebug() << s.readAll();
s << "Test" << 777 << endl << flush;
s.seek(0);
qDebug() << s.readAll();
当然我没有得到我之前写的数据部分,而是累积的数据:
"Test666\n"
"Test666\nX\n"
"Test666\nX\nTest777\n"
我可以进行自适应搜索调用以获取正确的数据,但我不希望无限增长。QBuffer
我尝试s.reset()
在写入之间进行调用,但结果是一样的。直接在缓冲区上调用reset()
oropen()/close()
会产生残缺的结果(这是预期的,因为绕过了流):
"Test666\n"
"X\nst666\n"
"Test777\n"
我可能会为每个周期构建一个新缓冲区,打开它并将其附加到流中,但这很慢。
这个用例是否有适当且快速的解决方案?
解决方案
您可以使用 直接访问QBuffer
内部QByteArray
存储QBuffer::buffer()
,然后使用 删除所有内容QByteArray::clear()
。然后手动seek()
回到开始。
QBuffer b;
b.open(QIODevice::ReadWrite);
QTextStream s(&b);
s << "Test" << 666 << endl << flush;
s.seek(0);
qDebug() << s.readAll();
b.buffer().clear();
s.seek(0);
s << "X" << endl << flush;
s.seek(0);
qDebug() << s.readAll();
b.buffer().clear();
s.seek(0);
s << "Test" << 777 << endl << flush;
s.seek(0);
qDebug() << s.readAll();
"Test666\n"
"X\n"
"Test777\n"
QTextStream
还有一个构造函数,它QByteArray
直接接受 a 并QBuffer
自动创建,在这种情况下可以节省一些代码。
推荐阅读
- android - Android共享库符号解析机制
- mysql - 如何结合 `MAX` 和 `JOIN` 以获得正确的输出?
- windows - (win10) Ndis 微型端口驱动程序,在 MpInitialize 之前未调用 EvtDeviceAdd
- django - 如何在 Django 模板标签中执行异常处理(try-catch)?
- c# - Swagger Auth 使用用户名和密码 .netcore 2
- kotlin - 如何将类类型传递给kotlin中的函数?
- python - PySnmp:无法设置 OID 的值(“str”对象没有属性“getTagSet”)
- c# - 尽管计数工作正常,但组的不同计数失败
- mysql - Sequelize 连接表不重新调整附加字段
- ruby - 带有 jemalloc 的 Ruby 2.6.5