文章目錄
- QDataStream的例子
- 一、QDataStream構造函數
- 二、Public Types
- 三、Public Functions
- 1.I/O設備
- 2.字節序列化順序
- 3.序列化的版本號
- 4.讀取流和寫入流
- 讀取緩衝區"s"並返回對流的引用:readBytes(char *& s, uint & l)
- 讀取len字節到"s":readRawData(char * s, int len)
- 將長度說明符len和緩衝區s寫入流:writeBytes(const char * s, uint len)
- 將“s”的len個字節寫入流:writeRawData(const char * s, int len)
- 5.浮點精度
- 返回浮點精度:floatingPointPrecision()
- 設置數據流的浮點精度:setFloatingPointPrecision(FloatingPointPrecision precision)
- 6.流的狀態
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()
重置數據流的狀態。
剩下的一些運算符重載就不看了。