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. POJ 2313 Sequence#贪心

    (- ̄▽ ̄)-* 找规律 //初始化为B[i]=A[i] //然后由V=|A[1]-B[1]|+|A[2]-B[2|+|A[3]-B[3]| // +|B[1]-B[2]|+|B[2]-B[3]| / ...

  2. 浙大pat 1037

    1037. Magic Coupon (25) 时间限制 100 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The magi ...

  3. Angular2,React集成

    https://www.packtpub.com/books/content/integrating-angular-2-react http://www.syntaxsuccess.com/view ...

  4. 线索thread二叉树

    对于一个普通的二叉树 我们可以很明显的看到,在一个二叉树中,会有许多的空结点,而这些空结点必然会造成空间的浪费,为了解决这个问题,我们可以引入线索二叉树,把这些空结点利用起来,利用 '^' 记录给定结 ...

  5. ARC 下面可能导致的内存问题

    一.ARC相对MRC来说,减轻了程序员的大部分内存管理工作,使用ARC的时候也需要十分清除内存管理的原理,不然可能带来一些很难调试的问题.下面是ARC下面需要注意的一些问题 1)对象互相引用,形成引用 ...

  6. 转 delphi SelText,GetText,SetText用法

    转自:http://blog.163.com/wll_009/blog/static/1173731172009102452632968/ 这几个都跟选区有关的,就是选中一串字符串,选中的会变蓝色Se ...

  7. webapi中的扩展点

    Extension Points Web API provides extension points for some parts of the routing process. Interface ...

  8. java增加时间

    一个简单的东西. 示例如下: /** * 增加时间 * @param oldDate 老时间 * @param addtime 增加的时间 * @return */ public Date addDa ...

  9. hdu 1210 Eddy's 洗牌问题

    Problem Description Eddy是个ACMer,他不仅喜欢做ACM题,而且对于纸牌也有一定的研究,他在无聊时研究发现,如果他有2N张牌,编号为1,2,3..n,n+1,..2n.这也是 ...

  10. digitalocean完成B轮8300万美元融资,赠送10美元优惠码

    7月8日,美国vps服务商digitalocean在官方博客宣传,公司完成高达8300万美元B轮融资.融资方包括 IA Ventures, Andreessen Horowitz和Access Ind ...