2010-04-22 156 views
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等问题QDataStream&QDataStream :: operator >>(char *&s)

回答

2

假设msnLogFile以前没有使用QDataStream创建(如果是,那么完全忽略此答案),则不需要使用>>操作符。

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

如果msnLogFile的内容是严格的文字,你需要通过QIODevice::Text标志即可打开并使用QIODevice::readLine()QIODevice::readAll(),但如果它的二进制数据,你必须按照正确的顺序使用QDataStream::readRawData()和读取数据回来了正确的大小。

1

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