天天看點

剖析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):

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

版權申明:

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

并請聯系譚海燕本人或者前往譚海燕個人首頁留言

繼續閱讀