【问题标题】:Repeatedly write and read to/from QBuffer via QTextStream通过 QTextStream 反复读写 QBuffer
【发布时间】:2019-06-23 08:34:55
【问题描述】:

我正在尝试通过QTextStream 反复写入/读取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"

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

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

【问题讨论】:

    标签: c++ qt read-write qtextstream qbuffer


    【解决方案1】:

    您可以使用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,在这种情况下可以节省一些代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多