通过QTextStream反复向QBuffer读写

时间:2019-06-23 08:34:55

标签: c++ qt read-write 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()open()/close()会产生严重的结果(由于绕过流,这是预期的结果):

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

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

针对该用例是否有适当且快速的解决方案?

1 个答案:

答案 0 :(得分:1)

您可以直接通过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还有一个constructor,它直接获取QByteArray并自动创建QBuffer,在这种情况下可以节省一些代码。