Небольшая путаница здесь: я пытаюсь сделать это:
QBuffer _ourLogMessageBuffer;
QByteArray theLogMessage;
...
qDebug() << "Writing " << theLogMessage.size() << " bytes to buffer\n";
qint64 numberOfBytes - _ourLogMessagesBuffer.write(theLogMessage);
qDebug() << "Wrote " << numberOfBytes << " bytes to buffer\n";
qDebug() << "Buffer has " << _ourLogMessagesBuffer.bytesAvailable()
<< " bytes available to read (after write)\n";
Это выводит следующее:
Writing 196 bytes to buffer
Wrote 196 bytes to buffer
Buffer has 0 bytes available to read (after write)
Эта последняя строка действительно смущает меня. Я думал, что возвращаемое значение из метода .write () должно было сказать, сколько байтов было записано? Почему они не были бы доступны?
И позже я пытаюсь сделать следующее:
qDebug() << "Buffer has " << _ourLogMessagesBuffer.bytesAvailable()
<< " bytes available to read (before read)\n";
char logMessageBytes[565];
qint64 numberOfBytes = _ourLogMessagesBuffer.read(logMessageBytes, 565);
qDebug() << "Read " << numberOfBytes << " bytes from buffer\n";
Учитывая предыдущий результат bytesAvailable, вывод этих вызовов не слишком удивителен. Они выводят следующее:
Buffer has 0 bytes available to read (before read)
Read 0 bytes from buffer
Поэтому я чувствую, что пропускаю шаг, и вам нужно что-то делать между записью и данными, доступными для чтения. Возможно, какой-то поиск или что-то? Но мне кажется, что мне не хватает того, что сказано в документации.
Любые советы будут оценены. Спасибо!
Вам нужно искать вернуться к позиции, из которой вы хотите прочитать:
_ourLogMessagesBuffer.seek(0);
Тогда вы сможете увидеть соответствующее количество байтов в наличии. Если вы думаете о (физическом) указателе на позицию на ленте, это имеет смысл. Когда вы пишете, указатель перемещается в конец, где он может записать больше данных. Любая лента перед указателем является «пустой»; читать нечего (для «пустой» ленты, нового или пустого буфера).
Когда вы просто пишете, позиция автоматически обновляется для вас. Но если вы хотите прочитать данные, которые вы уже написали, вы должны сказать им, чтобы вернуться.
Исключением является, скажем, формат файла. Если мы изменяем существующий файл, мы можем обновить временную метку фиксированной длины в одной части, затем сразу прочитать пару байтов, обозначающих длину строки «автора», а затем прочитать эту строку. Для этого нам не понадобится seek
так как все данные являются смежными, а write
а также read
функции обрабатывают перемещение позиции в файле (буфере) автоматически.
Если у вас есть несмежные чтения / записи, вам нужно seek
, В противном случае он не может читать ваши мысли о том, откуда вы хотите читать.
Других решений пока нет …