剖析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
并請聯系譚海燕本人或者前往譚海燕個人首頁留言