首页 > 解决方案 > 通过 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"

我可能会为每个周期构建一个新缓冲区,打开它并将其附加到流中,但这很慢。

这个用例是否有适当且快速的解决方案?

标签: c++qtread-writeqtextstreamqbuffer

解决方案


您可以使用 直接访问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自动创建,在这种情况下可以节省一些代码。


推荐阅读