1

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

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

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

任何提示将不胜感激。谢谢!

4

1 回答 1

2

您需要回到您要读取的位置:

_ourLogMessagesBuffer.seek(0);

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

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

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

如果您有不连续的读/写,则需要seek. 否则,它无法读取您想从哪里读取的想法。

于 2018-02-26T15:23:19.120 回答