2013-04-18 26 views
3
QTemporaryFile tf; 
tf.open(); 
QDataStream tfbs (&tf); 
tfbs << "hello\r\n" << "world!\r\n"; 
const int pos = int (tf.pos()); 

QByteArray ba; 
ba.append ("hello\r\n"); 
ba.append ("world!\r\n"); 
const int size = ba.size(); 

基本上我的問題是,我做錯了什麼?爲什麼是pos>大小?我應該不使用< <?我應該不使用QDataStream嗎?QDataStream和QByteArray之間的區別

編輯:有沒有辦法配置QDataStream或QTemporaryFile,以便<運算符不預先配置32位長度的字符串並將空終止符存儲在文件中?當我只有一系列帶引號的字符串和QStrings對非常難看的代碼進行調用時調用QDataStream :: writeBytes。

+0

如果您要指出「pos」和「size」實際上是什麼,可能會有所幫助。 – jkerian

+0

pos == 25,size == 15 – cppguy

+0

第一個是流,第二個是數組,他們服務完全不同的目的,經常一起使用 – dtech

回答

2

答案是在文檔中。我不打算通過QByteArray,因爲我相信這是相當明顯的,它按預期工作。

QDataStream運算符< <(char *)重載計算結果爲the writeBytes() function

該函數輸出:

寫入長度說明符LEN和緩衝s到流和 返回流的引用。該len被序列化爲quint32, ,後面跟着來自s的len個字節。請注意,數據不會被編碼。

所以對於"hello\r\n",我希望的輸出是:

0,0,0,8,'h','e','l','l','o','\r','\n',0 

4字節的長度,隨後從所述串的字節數。字符串結尾的NULL可能也被添加到結尾,這將佔據另外神祕的額外兩個字節。

+0

是的,我錯過了。希望有一個標準的清潔方式來將字符串寫入臨時文件 – cppguy

+0

@cppguy - 也許用QTextStream? – dtech

+0

不幸的是我正在寫字符串,然後是一個大的QByteArray。我希望能處理所有這些情況 – cppguy

0

所以我結束了寫我自己的助手連載我的數據:

class QBinaryStream 
{ 
public: 
    QBinaryStream (QIODevice& iod) : m_iod (iod) {} 
    QBinaryStream& operator << (const char* data) 
    { 
     m_iod.write (data); 
     return *this; 
    } 
    QBinaryStream& operator << (const QString& data) 
    { 
     return operator << (data.toUtf8()); 
    } 
    QBinaryStream& operator << (const QByteArray& data) 
    { 
     m_iod.write (data); 
     return *this; 
    } 

private: 
    QIODevice& m_iod; 
}; 
0

我現在不使用QDataStream?

在你的情況下,也許QTextStream甚至QString會做。

QTextStream類提供了一個方便的閱讀界面和 寫文字。

QTextStream可以在QIODevice,QByteArray或QString上運行。 使用QTextStream的流媒體運算符,可以方便地讀取並編寫文字,線條和數字。

至於QByteArrayQstring儘可能

的的QByteArray類提供一個字節數組應首選它。

QByteArray可用於存儲原始字節(包括'\ 0's')和 傳統的8位'\ 0'終止的字符串。使用QByteArray比使用const char *更方便 。在幕後,始終使用 確保數據後面跟着'\ 0'終止符,並使用隱式共享(寫時複製)來減少內存使用量並避免不必要的數據複製。

除了QByteArray,Qt還提供了QString類來存儲 字符串數據。對於大多數目的來說,QString是你想要使用的類。 它存儲16位Unicode字符,可以方便地在您的應用程序中存儲非ASCII /非拉丁-1字符 。此外,QString在整個Qt API中都有使用。當需要存儲原始二進制數據 以及內存保存至關重要時(例如,使用Qt for Linux嵌入式 Linux),適用於QByteArray的兩個主要情況就是 。