閱讀174 返回首頁    go 阿裏雲 go 技術社區[雲棲]


剖析QTextStream和QDataStream的區別

剖析QTextStream和QDataStream的區別

 

對於初學者來說,QTextStream和QDataStream這兩個概念的確不太好理解和區分,究竟什麼時候適合使用QTextStream什麼時候適合使用QDataStream也不是很明晰。

QTextStream和QDataStream都是麵向數據流的,都適用於QIODevice,但是他們的側重點不同。可以這麼說,QTextStream能做的事情QDataStream都能做。
QTextStream側重於向QIODevice文本讀寫,這裏所說的文本指的是普通的簡單的QChar,QString,QLatin1Char,int等等之內的,和C語言中寫文件或者網絡傳輸的時候,先將內容填充到一個buffer,進行操作有點類似,屬於普通的輕量級的流操作類。

 

//下麵代碼就是寫文件操作 QFile data("output.txt"); if (data.open(QFile::WriteOnly | QFile::Truncate)) { QTextStream out(&data); out << "Result: " << qSetFieldWidth(10) << left << 3.14 << 2.7; // writes "Result: 3.14 2.7 " }

 

 

QDataStream則是側重於數據格式和類型。QDataStream數據流不僅可以操作QTextStream所能處理的普通文本,而且可以對特定格式的類型數據進行完美的輸入與輸出。

熟悉Linux C開發的程序員應該知道,通過socket傳輸text文本數據比較容易,如果我們想通過socket傳輸特定的數據節結構而且跨平台以及CUP進行操作和解析就比較麻煩。比如對於一個點的坐標,要麼傳輸一個結構體,讓接收端進行解析,但是可能對於不同的平台以及不同的內存分配方式的CPU來說,解析的結果不一定是我們預期的,可是實現,但是會比較麻煩。

QDataSream就可以輕鬆的做到這一點,QDataSream將數據序列化。不僅可以讀寫text,而且還好可以讀寫一個特定是數據類型,比如QPoint, QFont,幾乎Qt支持的所有類型都可以使用QDataSream進行操作。

就拿讀寫QPoint為例:

 

 

QPoint pos(8, 6) QPoint tmp; QByteArray datagram; QDataStream out(&datagram, QIODevice::WriteOnly); out.setVersion(QDataStream::Qt_4_3); out << pos();//此時,datagram裏麵的內容就是一個QPoint。 out >> tmp//此時tmp的坐標就是tmp(8, 6);

 

 

 

QDataStream是根據類型以及輸出輸入順序來決定輸出數據。列舉下麵的例子來說明問題

 

QFile file("file.dat"); file.open(QIODevice::WriteOnly); QDataStream out(&file); // we will serialize the data into the file out << QString("the answer is"); // serialize a string out << (qint32)42; // serialize an integer Example (read binary data from a stream): QFile file("file.dat"); file.open(QIODevice::ReadOnly); QDataStream in(&file); // read the data serialized from the file QString str; qint32 a; in >> str >> a; // extract "the answer is" and 42

 

 

 

 

 

 


版權申明:
轉載文章請注明原文出處https://blog.csdn.net/feiyinzilgd/archive/2010/12/30/6107587.aspx

並請聯係譚海燕本人或者前往譚海燕個人主頁留言

最後更新:2017-04-02 06:51:33

  上一篇:go 手把手教你寫回調函數
  下一篇:go 04.javascript事件綁定