QT QT QBuffer字节编写的字节无法读取

Qt QBuffer bytes written cannot be read

本文关键字:QT 字节 读取 QBuffer      更新时间:2023-10-16

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

QBuffer _ourLogMessageBuffer;
QByteArray theLogMessage;
...
qDebug() << "Writing " << theLogMessage.size() << " bytes to buffern";
qint64 numberOfBytes - _ourLogMessagesBuffer.write(theLogMessage);
qDebug() << "Wrote " << numberOfBytes << " bytes to buffern";
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 buffern";

考虑到以前的字节可观结果,这些呼叫的输出并不令人惊讶。他们输出以下内容:

Buffer has 0 bytes available to read (before read)
Read 0 bytes from buffer

所以我觉得我错过了一步,并且您必须在写作和可以阅读的数据之间做一些事情。也许有某种寻求?但是我似乎缺少在文档中说的。

任何技巧都将不胜感激。谢谢!

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

_ourLogMessagesBuffer.seek(0);

然后,您将能够看到适当数量的字节可观。如果您将(物理(指向磁带上的位置,那是有道理的。当您编写时,指针移至可以编写更多数据的末端。指针前的任何磁带都是"空白";没有什么可阅读的(对于"空白"胶带,新的或空的缓冲区(。

仅写作时,该位置会自动为您更新。但是,如果您想读取已经写过的数据,则需要告诉它回去。

一个例外是文件格式。如果我们正在修改现有文件,我们可以在一个部分中更新固定长度的时间戳,然后立即读取一对表示"作者"字符串长度的字节,然后读取该字符串。为此,我们不需要seek作为所有数据都是连续的,writeread的功能将自动移动文件(缓冲区(中的位置。

如果您的读取/写入不合格,则需要seek。否则,它将无法阅读您要阅读的位置。