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

潘李亮 2004-10-25 12:41:31
如何将一个 内存 模拟成一个C++流,
http://blog.csdn.net/nhsoft/

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

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

#ifndef __MEM_STREAM_BUFFER_H__
#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(size_t len)
{
alloc_buf(len);
_init();
}
~mem_streambuf()
{
dealloc_buf();
}
mem_streambuf()
{
m_buffer = NULL;
m_bIsAllocInner =false;
m_bufLen = 0;
}

bool alloc_buf(int len)
{
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);
}

};

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(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;
}

};

typedef basic_imemstream<char> imemstream;
typedef basic_imemstream<wchar_t> wimemstream;

}
#endif

...全文
118 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzheng318 2004-10-25
  • 打赏
  • 举报
回复
我不是很懂,还是帮楼主顶吧

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧