2012-06-20 164 views
0

試圖做最簡單的事情。以二進制模式(無符號16)在QT中編寫一個數字並在matlab中讀取文件。我使用追加模式,因爲我將在未來將文件添加到文件中但似乎無法做到這一點。在QT中編寫二進制文件並在matlab中讀取

這是QT碼:

QFile f("C:\\temp.dat"); 
f.open(QIODevice::WriteOnly | QIODevice::Append) 
QDataStream out(&f); 
out<<quint16(270); 
f.close(); 

這是Matlab代碼:

fid = fopen('C:\\temp.dat'); 
F_nums = fread(fid,1,'*uint16'); 
fclose(fid); 

似乎很簡單,但它會讀取錯誤的數字...

謝謝!

+0

錯誤地是有點含糊。你用十六進制編輯器看過這個文件嗎?首先確保文件中存儲了正確的值。如果這個工程開始調試你的Matlab代碼。 –

+0

輸出:3585,而不是:270 – BioSP

+0

這沒有什麼幫助,輸出是什麼,誰輸出它?再次檢查文件內容... –

回答

2

問題很簡單:您正在編寫big-endian數據(MSB優先),但默認情況下Matlab默認使用小端數據。修復很簡單:

QFile f("C:\\temp.dat"); 
f.open(QIODevice::WriteOnly | QIODevice::Append) 
QDataStream out(&f); 
out.setByteOrder(QDataStream::LittleEndian); // *** set little endian byte order 
out<<quint16(270); 
f.close(); 
+0

謝謝,真的有用! – BioSP

1

QDataStream實際上並不意味着創建可跨不同應用程序移植的流。 (它可以在不同的操作系統和Qt版本中移植,但總是被Qt使用)。格式不能保證穩定,所以它可以在今天工作,但明天就會中斷。從文檔:

QDataStream的二進制格式已經從Qt 1.0開始發展,並且很可能會繼續發展以反映在Qt中完成的更改。當輸入或輸出複雜類型時,確保使用相同版本的流(版本())進行讀取和寫入 是非常重要的。

如果要共享數據,請使用用於共享的輸出格式,如XML,Json,或者在這種簡單情況下,只需將該數字作爲ANSI字符串寫出到文本文件。只需將QTextStream替換爲QDataStream即可。

+0

謝謝戴夫!文本的問題是我必須用很多數字將文件寫入文件多次。編寫簡單的文本需要大量的CPU資源,這就是二進制文件被考慮的原因。 – BioSP

+0

是的,我明白,但沒有「正確」的方式來編碼二進制格式的數字。 Qt任意選擇一種格式,以便它可以在各種操作系統上使用,而不管字節順序如何等等。但是不能保證(a)您的消費(非Qt)應用程序同意這是正確的方式,並且(b) Qt不會決定在下一個版本中更改格式。您可以明確要求Qt使用特定版本來解決問題(b),但Matlab可能會在不同的OS上以不同的方式讀取二進制數。 –

+0

非常感謝你,現在有道理。看起來,它的方式是製作一個QT exe文件,它將讀取二進制文件並在最後將其轉換爲txt文件。 – BioSP