一:概述
1) QBuffer 继承类QIODevice,如下:
class Q_CORE_EXPORT QBuffer : public QIODevice
2) QIODevice中有本文应用的函数:
(1)qint64 write(const char *data, qint64 len);
(2) qint64 read(char *data, qint64 maxlen);
(3)virtual bool open(OpenMode mode);
(4) virtual void close();
(5)virtual bool seek(qint64 pos);
3) 本位用到的GMemoryStream是从Qbuffer继承而来,其实把GMemoryStream看成Qbuffer一点也没有问题。
class GMemoryStream : public QBuffer
{
#ifndef QT_NO_QOBJECT
Q_OBJECT
#endif
public:
GMemoryStream(OpenMode flags = GStream::ReadWrite);
explicit GMemoryStream(GByteArray *buf, bool ownerBuf, OpenMode flags = GStream::ReadWrite);
virtual ~GMemoryStream();
private:
bool m_ownerBuf;
GByteArray *m_buf;
};
二:函数应用
(1)virtual bool seek(qint64 pos);
看下面的三句代码:
GMemoryStream* pStream = NULL;
pStream = new GMemoryStream();
pStream->seek(0);
pStream->seek(0);的作用在于找到流的开始位置,以便于以后写入。
(2)oStream.open(QIODevice::ReadWrite);
一个流只能打开一次,如果在一个流中被打开多次,则每一次都会回到流的开始位置。
(3)qint64 write(const char *data, qint64 len);
oStream.write((char*)(&nSize), sizeof(int));
可以把这句话理解为把int nSize;变量的值,写入到流oStream中。
写入的大小是4个字节。
写入的位置是上一个写入位置紧跟着的4个字节或流的开始位置。
(4) qint64 read(char *data, qint64 maxlen);
oStream.read((char*)(&nSize), sizeof(int));
可以把这句话理解为把流oStream的值读入到int nSize;中。
读入的大小是4个字节。
读入的位置是上一个读入位置紧跟着的4个字节或流的开始位置。
(5) virtual void close();用完了流就应该关闭
三:总结
(1)数据写入流
pStream = new GMemoryStream();pStream->seek(0);
oStream.write((char*)(&nSize), sizeof(int));
....
pStream->close();
(2)数据从流中加载
GMemoryStream oStream;
oStream.open(QIODevice::ReadWrite);
oStream.read((char*)(&nCount), sizeof(int));
....
oStream.close();
(3)Qbuffer应用不出错的关键是按字节格式写入流后,各个数据一定要按写入格式大小和顺序读入。一定要注意格式,Qbuffer可不能按名称查找数据奥