Неоднократно писать и читать в / из QBuffer через QTextStream

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

Решение

Вы можете получить доступ 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 также есть конструктор, который принимает QByteArray непосредственно и создает QBuffer автоматически, что может сохранить немного кода в этом случае.

Другие вопросы по тегам