如何将一个 内存 模拟成一个C++流,

原创 2004年10月25日 12:27:00

如何将一个 内存 模拟成一个C++流,
把一个内存new出来后,在这段内存上面建立一个 C++ 的istream类.以后所有的操作都可以对这个istream类进行.
这样做有很多好处,比如,你的资源分析器可以接受一个istream指针,这个istream可能是一个fstream.也可能是你从zip文件中解出到内存后,从内存构造的一个istream.

具体做法是,从basic_streambuf里派生一个类,
这里只介绍一个简单的支持输出的streambuf.如果谁完善了它,或者实现了一个支持各种特性,输入输出,block buffer等功能的时候,麻烦也告诉我一下.不胜感激.

#ifndef __MEM_STREAM_BUFFER_H__<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

#define __MEM_STREAM_BUFFER_H__

/*

提供 C++ 标准库的扩展。支持从一段内存上建立一个istream类。

 

作者: 潘李亮 2004 - 10 - 25

Xheartblue 2004-10-25

 

本代码为免费代码,可以只有使用和修改。

但是你得保留本声明和作者名字。

 

*/

#include <streambuf>

 

namespace std

{

 

    template <typename _CharT, typename _CharTrait = char_traits<_CharT> > 

    class mem_streambuf : public basic_streambuf<_CharT,_CharTrait>

    {

    public: //类型的定义

        typedef _CharT                             streambuf_type;

        typedef _CharT                             char_type;

        typedef int                                int_type;

        typedef typename std::streampos            pos_type;

        typedef typename std::streamsize           off_type;

 

    protected:

        size_t       m_bufLen;

        char_type*   m_buffer;

        bool         m_bIsAllocInner;

    public:

 

        //构造函数

        mem_streambuf(char_type* buf,size_t len)

        {

            set_buf(buf,len);

        }

        mem_streambuf()

        {

            m_buffer = NULL;

            m_bufLen = 0;

            m_bIsAllocInner = false;        

        }

        mem_streambuf(size_t len)

        {

            m_buffer = NULL;

            m_bufLen = 0;

            m_bIsAllocInner = false;

            alloc_buf(len);

            _init();

        }

        ~mem_streambuf()

        {

            dealloc_buf();

        }

 

        bool  alloc_buf(int len)

        {

            dealloc_buf();

            m_buffer = new char_type[len];

            m_bIsAllocInner = true;

            m_bufLen = len;

            return true;

        }

        bool  set_buf(char_type* buf,size_t len)

        {

            m_buffer = buf;

            m_bufLen = len;

            m_bIsAllocInner = false;

            _init();

            return true;

        }

        bool  dealloc_buf()

        {

            if(m_bIsAllocInner)

            {

                delete [] m_buffer;

            }

            m_buffer = NULL;

            m_bufLen = 0;

            m_bIsAllocInner = false;

            return true;

        }

 

        char_type* get_buf()

        {

            return m_buffer;

        }

 

    protected:

        void _init()

        {

            setg(m_buffer,m_buffer,m_buffer+ m_bufLen);

            setp(m_buffer,m_buffer,m_buffer+ m_bufLen);

        }

 

    };//endl class mem_streambuf;

 

    template <typename _CharT , typename _CharTrait = char_traits<_CharT> >

    class basic_imemstream : public basic_istream<_CharT,_CharTrait>

    {

    public:

        typedef mem_streambuf<_CharT,_CharTrait> stream_type;

        typedef _CharT                           char_type;

    protected:

        stream_type m_buffer;

 

    public:

        basic_imemstream(stream_type* buf): basic_istream<_CharT,_CharTrait>(buf)

        {

        }

 

        basic_imemstream(char_type* buf,size_t len)

            :m_buffer(buf,len),basic_istream<_CharT,_CharTrait>(&m_buffer)

        {

        }

 

        basic_imemstream():m_buffer(),basic_istream<_CharT,_CharTrait>(&m_buffer)

        {

 

        }

 

        basic_imemstream(int len)

            :m_buffer(len),basic_istream<_CharT,_CharTrait>(&m_buffer)

        {

        }

 

        void set_buf(char_type* buf,int len)

        {

            m_buffer.set_buf(buf,len);

        }

 

        char_type* get_buf()

        {

            return m_buffer.get_buf();

        }

 

        basic_streambuf<_CharT,_CharTrait>* rdbuf()

        {

            return &m_buffer;

        }

 

        void      rdbuf(basic_streambuf<_CharT,_CharTrait>* buf)

        {

            m_buffer = buf;

        }

 

    };

 

 

    template <typename _CharT , typename _CharTrait = char_traits<_CharT> >

    class basic_omemstream : public basic_ostream<_CharT,_CharTrait>

    {

    public:

        typedef mem_streambuf<_CharT,_CharTrait> stream_type;

        typedef _CharT                           char_type;

    protected:

        stream_type m_buffer;

 

    public:

        basic_omemstream(stream_type* buf): basic_ostream<_CharT,_CharTrait>(buf)

        {

        }

 

        basic_omemstream(char_type* buf,size_t len)

            :m_buffer(buf,len),basic_ostream<_CharT,_CharTrait>(&m_buffer)

        {

        }

 

        basic_omemstream():m_buffer(),basic_ostream<_CharT,_CharTrait>(&m_buffer)

        {

 

        }

 

        basic_omemstream(int len)

            :m_buffer(len),basic_ostream<_CharT,_CharTrait>(&m_buffer)

        {

        }

 

        void set_buf(char_type* buf,int len)

        {

            m_buffer.set_buf(buf,len);

        }

 

        char_type* get_buf()

        {

            return m_buffer.get_buf();

        }

 

        basic_streambuf<_CharT,_CharTrait>* rdbuf()

        {

            return &m_buffer;

        }

 

        void      rdbuf(basic_streambuf<_CharT,_CharTrait>* buf)

        {

            m_buffer = buf;

        }

 

    };

 

    template <typename _CharT , typename _CharTrait = char_traits<_CharT> >

    class basic_memstream : public basic_ostream<_CharT,_CharTrait>,public basic_istream<_CharT,_CharTrait>

    {

    public:

        typedef mem_streambuf<_CharT,_CharTrait> stream_type;

        typedef _CharT                           char_type;

    protected:

        stream_type m_buffer;

 

    public:

        basic_memstream(stream_type* buf)

            : basic_ostream<_CharT,_CharTrait>(buf),

            basic_istream<_CharT,_CharTrait>(buf)

        {

        }

 

        basic_memstream(char_type* buf,size_t len)

            :m_buffer(buf,len),

            basic_ostream<_CharT,_CharTrait>(&m_buffer),

            basic_istream<_CharT,_CharTrait>(&m_buffer)

        {

        }

 

        basic_memstream()

            :m_buffer(),

            basic_ostream<_CharT,_CharTrait>(&m_buffer),

            basic_istream<_CharT,_CharTrait>(&m_buffer)

        {

        }

 

        basic_memstream(int len)

            :m_buffer(len),

            basic_istream<_CharT,_CharTrait>(&m_buffer),

            basic_ostream<_CharT,_CharTrait>(&m_buffer)

        {

        }

 

        void set_buf(char_type* buf,int len)

        {

            m_buffer.set_buf(buf,len);

        }

 

        char_type* get_buf()

        {

            return m_buffer.get_buf();

        }

 

        basic_streambuf<_CharT,_CharTrait>* rdbuf()

        {

            return &m_buffer;

        }

 

        void      rdbuf(basic_streambuf<_CharT,_CharTrait>* buf)

        {

            m_buffer = buf;

        }

 

    };

 

    typedef basic_imemstream<char>    imemstream;

    typedef basic_imemstream<wchar_t> wimemstream;

    typedef basic_omemstream<char>    omemstream;

    typedef basic_omemstream<wchar_t> womemstream;

    typedef basic_memstream<char>     memstream;

    typedef basic_memstream<wchar_t>  wmemstream;

 

}

#endif

java 内存流 利用内存流复制文件

package keTangTest; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.File...
  • weishimeng17
  • weishimeng17
  • 2017年04月19日 16:33
  • 743

通过内存模拟硬盘实现一个简单的块设备驱动

本文的主要工作是通过硬盘来模拟内存,按照块设备驱动编程的框架实现一个简单的块设备驱动程序。 一、前期的准备工作 1、基本开发环境 Linux内核版本:Linux-3.4.10 开发板 ...
  • TECH_PRO
  • TECH_PRO
  • 2017年05月22日 12:54
  • 727

c++动态内存管理

我们都知道在c++中可以用new/malloc动态分配内存空间用delete/free释放动态开辟的内存空间。c++中的malloc/free是继承c语言中的malloc/free,它的用法和在C语言...
  • xyzbaihaiping
  • xyzbaihaiping
  • 2016年04月11日 20:04
  • 1429

内存文件系统c/c++实现(VS2008)

做了这么一个题,用来模拟文件管理
  • sjx90
  • sjx90
  • 2014年05月06日 16:35
  • 1236

一个简单的Java IO流写的记事本

public class Notepad extends JFrame implements ActionListener{ JMenuBar jmb; //菜单栏 JMenu jm; //...
  • Joseph5798
  • Joseph5798
  • 2016年03月12日 17:38
  • 345

MySQL Memory存储引擎表

内存表使用哈希散列索引把数据保存在内存中,因此具有极快的速度,适合缓存中小型数据库,但是使用上受到一些限制。 内存表,就是放在内存中的表,所使用内存的大小可通过my.cnf中的max_heap_t...
  • dsx001tz
  • dsx001tz
  • 2014年02月18日 15:13
  • 756

块设备驱动之内存模拟硬盘

本文对块设备框架进行阐述,并以一个实际例子来清楚的让大家看到块设备的框架。...
  • u013584315
  • u013584315
  • 2014年05月08日 18:57
  • 1352

把一个图片裁剪成圆形或者自定义的图形

- (UIImage *)circleImage {     // NO代表透明     UIGraphicsBeginImageContextWithOptions(self.size, NO, 0...
  • qq_27074387
  • qq_27074387
  • 2016年08月08日 12:18
  • 746

C++输出输入流复制文件

C++输入输出流方式复制文件。 // stream.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include using...
  • qq5132834
  • qq5132834
  • 2015年01月03日 09:53
  • 793

判别一个分解的无损连接性

http://lwh.yangtzeu.edu.cn/lwhStudy/ktjx/chapter05/5.4.2.htm
  • yzl140520
  • yzl140520
  • 2008年12月19日 19:32
  • 311
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何将一个 内存 模拟成一个C++流,
举报原因:
原因补充:

(最多只允许输入30个字)