QT中流Qbuffer的应用总结

时间:2021-08-13 03:59:14

一:概述

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可不能按名称查找数据奥