2010-04-22 154 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)都使用相同的協議版本。