1
 QFile msnLogFile(item->data(Qt::UserRole).toString());
 QDataStream logDataStream;
    if(msnLogFile.exists()){
        msnLogFile.open(QIODevice::ReadOnly);
        logDataStream.setDevice(&msnLogFile);
        QByteArray logBlock;
        logDataStream >> logBlock;
    }

此代码不起作用。结果的 QByte 是空的。如果我使用 char* 也是一样。奇怪的是,相同的代码可以在另一个程序中工作。我想找出两者之间的区别。如果我使用 int、uint、quint8 等,这将有效

4

2 回答 2

3

假设 msnLogFile 以前没有使用 QDataStream 创建(如果是,则完全忽略此答案),您不想使用 >> 运算符。

原因是当 QDataStream 写入字符串时,它会将字符串的长度添加到输出字节中。这允许另一个 QDataStream 以正确的长度读回它并获得相同的结果。因此,为什么 int、qint8 等可以正常工作;没有前置大小,它只是原始数据。

如果 msnLogFile 的内容是严格的文本,则需要传递QIODevice::Text标志来打开并使用QIODevice::readLine()QIODevice::readAll(),但是如果是二进制数据,则必须使用QDataStream: :readRawData()并以正确的顺序以正确的大小读取数据。

于 2010-04-22T20:28:33.207 回答
1

我冒昧地猜测这是因为您没有指定协议版本。您应该调用setVersion()以确保可能使用不同版本的 Qt 的多台机器都使用相同的协议版本。

于 2010-04-22T19:54:58.847 回答