通过QTextStream重复读写to/from QBuffer

Repeatedly write and read to/from QBuffer via QTextStream

我正在尝试通过 QTextStream 重复写入和读取 to/from 一个 QBuffer 对象。首先我构造两个对象:

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()open()/close() 会产生残缺的结果(这是预期的,因为流被绕过了):

"Test666\n"
"X\nst666\n"
"Test777\n"

我可能可以为每个循环构建一个新缓冲区,打开它并将其附加到流,但那很慢。

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

您可以直接使用 QBuffer::buffer() 访问 QBuffer 的内部 QByteArray 存储,然后使用 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 还有一个 constructor 直接接受 QByteArray 并自动创建 QBuffer,在这种情况下可能会节省一些代码。