文章目录
QT的QDataStream:适用于二进制流的文件读取/写入操作,一起来学习吧。
QDataStream的例子
一、QDataStream构造函数
QDataStream()
构造没有I/O设备的数据流
QDataStream(QIODevice * d)
使用d这个IO设备构造数据流
QDataStream(QByteArray * a, QIODevice::OpenMode mode)
构造对字节数组a进行操作的数据流,mode描述如何使用设备。最好用来只写数据流
QDataStream(const QByteArray & a)
构造一个对字节数组a进行操作的只读数据流
二、Public Types
1. 读/写的字节顺序:ByteOrder
名称 | 值 | 说明 |
---|---|---|
QDataStream::BigEndian | QSysInfo::BigEndian | 最高有效字节优先(默认值) |
QDataStream::LittleEndian | QSysInfo::LittleEndian | 最低有效字节优先 |
2. 浮点数的精度:FloatingPointPrecision
名称 | 值 | 说明 |
---|---|---|
QDataStream::SinglePrecision | 0 | 数据流中的所有浮点数都具有32位精度 |
QDataStream::DoublePrecision | 1 | 数据流中的所有浮点数都具有64位精度 |
3. 流的状态:Status
名称 | 值 | 说明 |
---|---|---|
QDataStream::Ok | 0 | 数据流运行正常。 |
QDataStream::ReadPastEnd | 1 | 数据流读取的数据已超过底层设备中数据的结尾。 |
QDataStream::ReadCorruptData | 2 | 数据流已读取损坏的数据。 |
QDataStream::WriteFailed | 3 | 数据流不能写入底层设备 |
4. 序列化格式版本号:Version
名称 | 值 | 说明 |
---|---|---|
QDataStream::Qt_1_0 | 1 | Version 1 (Qt 1.x) |
QDataStream::Qt_2_0 | 2 | Version 2 (Qt 2.0) |
QDataStream::Qt_2_1 | 3 | Version 3 (Qt 2.1, 2.2, 2.3) |
QDataStream::Qt_3_0 | 4 | Version 4 (Qt 3.0) |
QDataStream::Qt_3_1 | 5 | Version 5 (Qt 3.1, 3.2) |
QDataStream::Qt_3_3 | 6 | Version 6 (Qt 3.3) |
QDataStream::Qt_4_0 | 7 | Version 7 (Qt 4.0, Qt 4.1) |
QDataStream::Qt_4_1 | Qt_4_0 | Version 7 (Qt 4.0, Qt 4.1) |
QDataStream::Qt_4_2 | 8 | Version 8 (Qt 4.2) |
QDataStream::Qt_4_3 | 9 | Version 9 (Qt 4.3) |
QDataStream::Qt_4_4 | 10 | Version 10 (Qt 4.4) |
QDataStream::Qt_4_5 | 11 | Version 11 (Qt 4.5) |
QDataStream::Qt_4_6 | 12 | Version 12 (Qt 4.6, Qt 4.7, Qt 4.8) |
QDataStream::Qt_4_7 | Qt_4_6 | Same as Qt_4_6. |
QDataStream::Qt_4_8 | Qt_4_7 | Same as Qt_4_6. |
QDataStream::Qt_4_9 | Qt_4_8 | Same as Qt_4_6. |
QDataStream::Qt_5_0 | 13 | Version 13 (Qt 5.0) |
QDataStream::Qt_5_1 | 14 | Version 14 (Qt 5.1) |
QDataStream::Qt_5_2 | 15 | Version 15 (Qt 5.2) |
QDataStream::Qt_5_3 | Qt_5_2 | Same as Qt_5_2 |
QDataStream::Qt_5_4 | 16 | Version 16 (Qt 5.4) |
三、Public Functions
是否到文件尾:atEnd()
bool QDataStream::atEnd() const
如果I/O设备已经到达结束位置(流或文件的结束),或者没有I/O设备集,则返回true;否则返回false
跳过len个字节:skipRawData(int len)
int QDataStream::skipRawData(int len)
1.跳过设备的len字节。返回实际跳过的字节数,或出错时返回-1
2.这相当于在长度为len的缓冲区上调用readRawData()并忽略该缓冲区
1.I/O设备
返回I/O设备:device()
QIODevice * QDataStream::device() const
返回当前设置的I/O设备,如果当前没有设置设备,则返回0
设置I/O设备:setDevice(QIODevice * d)
void QDataStream::setDevice(QIODevice * d)
将I/O设备设置为d,可以是0来取消设置为当前I/O设备
2.字节序列化顺序
返回字节顺序设置:byteOrder()
ByteOrder QDataStream::byteOrder() const
返回当前字节顺序设置——BigEndian或LittleEndian
设置序列化字节顺序:setByteOrder(ByteOrder bo)
void QDataStream::setByteOrder(ByteOrder bo)
1.将序列化字节顺序设置为bo
2.bo参数可以是QDataStream:BigEndian或QDataStream::LittleEndian
3.默认设置是big endian。除非您有特殊要求,否则我们建议您离开这个设置
3.序列化的版本号
返回序列化的版本号:version() const
int QDataStream::version() const
返回序列化的版本号
设置序列化格式版本:setVersion(int v)
void QDataStream::setVersion(int v)
1.将数据序列化格式的版本号设置为v,即版本enum的值。
2.如果您使用的是Qt的当前版本,则不必设置版本,但是对于您自己的自定义二进制格式,我们建议您这样做;
4.为了适应新的功能,一些Qt的datastream数据的序列化格式类改变了在一些版本的Qt。如果你想读的数据是由早期版本的Qt,可以读取或写入数据的程序编译Qt的早期版本,使用这个函数来修改
example:
QDataStream out(file);
out.setVersion(QDataStream::Qt_4_0);
4.读取流和写入流
读取缓冲区"s"并返回对流的引用:readBytes(char *& s, uint & l)
QDataStream & QDataStream::readBytes(char *& s, uint & l)
1.从流中读取缓冲区“s”并返回对流的引用。
2.缓冲区 “s” 是使用new[]分配的。使用delete[]操作符销毁它
3.l参数被设置为缓冲区的长度。如果读取的字符串为空,则将l设置为0,将s设置为空指针
4.序列化格式首先是一个quint32长度说明符,然后是l字节的数据
读取len字节到"s":readRawData(char * s, int len)
int QDataStream::readRawData(char * s, int len)
1.从流中最多读取len字节到“s”,并返回读取的字节数。如果发生错误,这个函数返回-1
2.缓冲区"s"必须预先分配。数据没有编码
将长度说明符len和缓冲区s写入流:writeBytes(const char * s, uint len)
QDataStream & QDataStream::writeBytes(const char * s, uint len)
1.将长度说明符len和缓冲区s写入流并返回对流的引用
2.len被序列化为quint32,后面是来自s的len字节。注意数据没有被编码
将“s”的len个字节写入流:writeRawData(const char * s, int len)
int QDataStream::writeRawData(const char * s, int len)
将len字节从s写入到流中。返回实际写入的字节数,如果错误则返回-1。数据没有编码
5.浮点精度
返回浮点精度:floatingPointPrecision()
FloatingPointPrecision QDataStream::floatingPointPrecision() const
返回数据流的浮点精度。
设置数据流的浮点精度:setFloatingPointPrecision(FloatingPointPrecision precision)
void QDataStream::setFloatingPointPrecision(FloatingPointPrecision precision)
1.将数据流的浮点精度设置为precision。
2.如果浮点精度是双精度,并且数据流的版本是Qt_4_6或更高,那么所有浮点数都将以64位精度进行读写。
3.如果浮点精度是SinglePrecision,版本是Qt_4_6或更高,那么所有浮点数都将以32位精度进行读写
4.默认值是DoublePrecision
5.此属性必须在写入数据流的对象和读取数据流的对象上设置为相同的值
6.流的状态
返回数据流的状态:status()
Status QDataStream::status() const
返回数据流的状态。
设置数据流的状态:setStatus(Status status)
void QDataStream::setStatus(Status status)
1.将数据流的状态设置为给定的“status”。
2.在调用resetStatus()之前,将忽略对setStatus()的后续调用。
重置数据流的状态:resetStatus()
void QDataStream::resetStatus()
重置数据流的状态。
剩下的一些运算符重载就不看了。