通过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
,在这种情况下可能会节省一些代码。
我正在尝试通过 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
,在这种情况下可能会节省一些代码。