Qt QBuffer写入的字节无法读取

Qt QBuffer bytes written cannot be read

这里有点混乱:我正在尝试这样做:

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() 方法中的 return 值应该表示写入了多少字节?为什么他们不可用?

然后,我尝试以下操作:

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

所以我觉得我错过了一步,你必须在写入和数据可供读取之间做一些事情。也许是某种寻求之类的?但我似乎遗漏了文档中的说明。

如有任何提示,我们将不胜感激。谢谢!

您需要seek回到您想阅读的位置:

_ourLogMessagesBuffer.seek(0);

然后您将能够看到适当数量的bytesAvailable。如果您将其视为指向磁带上某个位置的(物理)指针,这是有道理的。在您写入时,指针会移动到可以写入更多数据的末尾。指针前面的任何磁带都是 "blank";没有什么可读的(对于 "blank" 磁带,一个新的或空的缓冲区)。

刚写的时候,位置会自动为你更新。但是如果你想读取你已经写入的数据,你需要告诉它返回。

一个例外是文件格式。如果我们正在修改现有文件,我们可以在一部分中更新 fixed-length 时间戳,然后立即读取表示 "author" 字符串长度的几个字节,然后读入该字符串。为此,我们不需要 seek,因为所有数据都是连续的,writeread 函数会自动处理文件(缓冲区)内的位置移动。

如果您有 non-contiguous reads/writes,则需要 seek。否则,它无法读懂你想从哪里阅读。