Неоднократно писать и читать в / из QBuffer через QTextStream - PullRequest
0 голосов
/ 23 июня 2019

Я пытаюсь многократно писать и читать в / из 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 Ответ

1 голос
/ 24 июня 2019

Вы можете получить доступ к внутреннему хранилищу QBuffer *1001* напрямую с помощью 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 напрямую и автоматически создает QBuffer,который может сохранить небольшой код в этом случае.

...