天天看点

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

并请联系谭海燕本人或者前往谭海燕个人主页留言

继续阅读