1、MemoryStream.h文件内容

ifndef _MEM_STREAM_H_
#define _MEM_STREAM_H_ #include <string> class CMemoryStream
{
public:
explicit CMemoryStream(std::size_t size)
{
m_pBuffer = new unsigned char[size];
memset(m_pBuffer, 0, size);
m_nSize = size;
m_nCurrentWritePos = 0;
m_nCurrentReadPos = 0;
m_bManageMemory = true;
} CMemoryStream(void* buffer, std::size_t size)
{
m_pBuffer = (unsigned char*)buffer;
m_nSize = size;
m_nCurrentWritePos = 0;
m_nCurrentReadPos = 0;
m_bManageMemory = false;
} ~CMemoryStream()
{
if (m_bManageMemory)
{
delete [] m_pBuffer;
}
m_pBuffer = NULL;
} public:
template<typename T>
CMemoryStream& operator <<(const T& value)
{
if (m_pBuffer &&
m_nCurrentWritePos < m_nSize)
{
*(T*)(m_pBuffer + m_nCurrentWritePos) = value;
m_nCurrentWritePos += sizeof(T);
} return *this;
} template<typename T>
CMemoryStream& operator >>(T& value)
{
if (m_pBuffer &&
m_nCurrentReadPos < m_nSize)
{
value = *(T*)(m_pBuffer + m_nCurrentReadPos);
m_nCurrentReadPos += sizeof(T);
} return *this;
} CMemoryStream& operator <<(const char* pBuffer)
{
if (m_pBuffer &&
m_nCurrentWritePos < m_nSize)
{
std::size_t size = strlen(pBuffer) + 1;
memcpy(m_pBuffer + m_nCurrentWritePos, pBuffer, size);
m_nCurrentWritePos += size;
} return *this;
} CMemoryStream& operator <<(const std::string& str)
{
return operator <<(str.c_str());
} CMemoryStream& operator >>(const char* &pBuffer)
{
if (m_pBuffer &&
m_nCurrentReadPos < m_nSize)
{
const char* p = (const char*)(m_pBuffer + m_nCurrentReadPos);
std::size_t size = strlen(p);
if (size + m_nCurrentReadPos < m_nSize)
{
pBuffer = p;
m_nCurrentReadPos += size+1;
}
} return *this;
} CMemoryStream& operator >>(std::string& str)
{
if (m_pBuffer &&
m_nCurrentReadPos < m_nSize)
{
const char* p = (const char*)(m_pBuffer + m_nCurrentReadPos);
std::size_t size = strlen(p);
if (size + m_nCurrentReadPos < m_nSize)
{
str.assign(p, p + size);
m_nCurrentReadPos += size+1;
}
} return *this;
} CMemoryStream& operator <<(const wchar_t* pBuffer)
{
if (m_pBuffer &&
m_nCurrentWritePos < m_nSize)
{
std::size_t size = (wcslen(pBuffer) + 1) * sizeof(wchar_t);
memcpy(m_pBuffer + m_nCurrentWritePos, pBuffer, size);
m_nCurrentWritePos += size;
} return *this;
} CMemoryStream& operator <<(const std::wstring& str)
{
return operator <<(str.c_str());
} CMemoryStream& operator >>(const wchar_t*& pBuffer)
{
if (m_pBuffer &&
m_nCurrentReadPos < m_nSize)
{
const wchar_t* p = (const wchar_t*)(m_pBuffer + m_nCurrentReadPos);
std::size_t size = wcslen(p) * sizeof(wchar_t);
if (size + m_nCurrentReadPos < m_nSize)
{
pBuffer = p;
m_nCurrentReadPos += size+sizeof(wchar_t);
}
} return *this;
} CMemoryStream& operator >>(std::wstring& str)
{
if (m_pBuffer &&
m_nCurrentReadPos < m_nSize)
{
const wchar_t* p = (const wchar_t*)(m_pBuffer + m_nCurrentReadPos);
std::size_t size = wcslen(p) * sizeof(wchar_t);
if (size + m_nCurrentReadPos < m_nSize)
{
str.assign(p, p + size);
m_nCurrentReadPos += size+sizeof(wchar_t);
}
} return *this;
} private:
CMemoryStream(const CMemoryStream& memstream); const CMemoryStream& operator =(const CMemoryStream&); private:
unsigned char* m_pBuffer;
std::size_t m_nSize;
std::size_t m_nCurrentWritePos;
std::size_t m_nCurrentReadPos; bool m_bManageMemory;
}; #endif

2、使用示例:

#include "stdafx.h"

#include "MemoryStream.h"

int _tmain(int argc, _TCHAR* argv[])
{
CMemoryStream mem(100); int a = 100;
int b;
const char* p1 = "123456";
const char* p2 = NULL;
const std::string s1 = "abcedfg";
std::string s2;
const wchar_t* p3 = L"789456";
const wchar_t* p4 = NULL;
const std::wstring s3 = L"mmm";
std::wstring s4;
double d1 = 100.5;
double d2 = 0;
float f1 = 200.5;
float f2 = 0; mem << a;
mem << p1;
mem << s1;
mem << p3;
mem << s3;
mem << d1;
mem << f1; mem >> b >> p2 >> s2 >> p4 >> s4 >> d2 >> f2; return 0;
}

c++内存流的更多相关文章

  1. Mybatis拦截器 mysql load data local 内存流处理

    Mybatis 拦截器不做解释了,用过的基本都知道,这里用load data local主要是应对大批量数据的处理,提高性能,也支持事务回滚,且不影响其他的DML操作,当然这个操作不要涉及到当前所lo ...

  2. [源码]ObjectIOStream 对象流 ByteArrayIOStream 数组流 内存流 ZipOutputStream 压缩流

    1.对象流 import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File ...

  3. 不可或缺 Windows Native (13) - C++: 标准输入, 标准输出, 字符串内存流

    [源码下载] 不可或缺 Windows Native (13) - C++: 标准输入, 标准输出, 字符串内存流 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 标准输 ...

  4. 内存流和null字节

    #include <stdio.h> #include <string.h> int main() { ]={}; FILE* fp = fmemopen(buf,," ...

  5. C#流总结(文件流、内存流、网络流、BufferedStream、StreamReader/StreamWriter、TextReader/TextWriter)

    一.文件流 FileStream类主要用于读写磁盘文件.常用于向磁盘存储数据或读取配置文件. 读取文件: //文件流:读取 FileStream fileStream = File.Open(@&qu ...

  6. 如何在MVC中显示条形码图片(以内存流的方式)

    前台代码: <script type="text/javascript"> function fresh() { var getimagecode = document ...

  7. UNIX编程之冲洗内存流与null追加策略(APUE F5-15)

    博文链接:http://haoyuanliu.github.io/2016/04/29/mysql/ 对,我是来骗访问量的!O(∩_∩)O~~ 最近一直在拜读APUE(Advanced Program ...

  8. IO流(随机流,数组内存流

    File file1=new File("test1.txt"); RandomAccessFile in2=new RandomAccessFile(file1,"rw ...

  9. Delphi从内存流中判断图片格式(好多相关文章)

    废话不多说了,利用内存流来判断文件的格式,其实判断文件的前几个字节就可以简单的判断这个文件是什么类型的文件,例如jpg文件 是 FFD8 (从低位到高位就要反过来 D8FF 下面都是一样)BMP文件  ...

  10. 用内存流 文件流 资源生成客户端(Delphi开源)

    正文:很多木马生成器就是用的内存流和文件流生成客户端的,废话不多说了,代码如下: unit Main; interface usesWindows, Messages, SysUtils, Varia ...

随机推荐

  1. 一、ASP.NET Routing路由(深入解析路由系统架构原理)

    阅读目录: 1.开篇介绍 2.ASP.NET Routing 路由对象模型的位置 3.ASP.NET Routing 路由对象模型的入口 4.ASP.NET Routing 路由对象模型的内部结构 4 ...

  2. [FBA]SharePoint 2013自定义Providers在基于表单的身份验证(Forms-Based-Authentication)中的应用

    //http://tech.ddvip.com/2014-05/1401197453210723.html 由于项目的需要,登录SharePoint Application的用户将从一个统一平台中获取 ...

  3. 查看linux系统版本是32位还是64位

    如何查看ubuntu版本是64位还是32位的: 1.# uname -a 如果有x86_64就是64位的,没有就是32位的 2.# uname -mx86_64 3.# archx86_6 如何查看u ...

  4. crontab定时任务

    使用cron服务,用 service crond status 查看 cron服务状态,如果没有启动则 service crond start启动它, cron服务是一个定时执行的服务,可以通过cro ...

  5. logrotate日志轮转配置文档

    转自:http://blog.163.com/bull_linux/blog/static/2138811422013101334544349/ 使用:    logrotate CONF_FILE+ ...

  6. 设M=5^2003+7^2004+9^2005+11^2006,求证8|M。(整除理论,1.1.8)

    设M=52003+72004+92005+112006,求证8|M. 证明: 前提:对于,52003让我们去构造8,即用8-3替换5 第一步:用8-3替换5,且仅替换一个, 第二步:进行分项,则前一项 ...

  7. 3.1 Data Member的绑定

       文章开始提出了一段示例代码,并讨论了返回哪个x的问题.然后 a)   给出了我们普遍认为正确的回答,并肯定了这个想法: b)   提醒大家,这在以前的编译器实现中,并非正确. 在早期的实现中,首 ...

  8. 笔记一:OOAD与UML

    一.面向对象的概念与方法 1.  面向对象 1.1. 面向对象是一种系统建模技术 1.2. 面向对象编程是按照OO的方法学来开发程序的过程 1.3. 通过分析系统内对象的交互来描述或建模一个系统 1. ...

  9. Brackets + Sass 学习心得

    大家知道Brackets是一个可以实时浏览html页面修改效果的工具,对于前段开发人员应该不会陌生,有了它,布局页面再也不是什么困难了, 目前为止已经更新到1.6了. 下载最新版可以到官方网: htt ...

  10. 使用cocoapods的两个大坑的修改方法

    1.报错内容: [!] The dependency `ReactiveCocoa (= 2.1.8)` is not used in any concrete target. The depende ...