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. linux deepin 12.12.1和Windows 7双系统修改默认启动项

    1.打开终端,输入 sudo gedit /etc/default/grub ,然后输入密码.2.在出来的文本编辑器中找到 GRUB_DEFAULT=0 一行,把0改为2(因为我的Windows 7在 ...

  2. onSaveInstanceState()和onRestoreInstanceState()方法

    Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate().onPause()等生命周期方 ...

  3. JAVASCRIPT 框架>>

    jQuery jQueryjQuery 是目前最受欢迎的 JavaScript 框架 jQuery 是为处理 HTML 事件而特别设计的<script type="text/javas ...

  4. LeetCode OJ 4. Median of Two Sorted Arrays

    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...

  5. SourceInsight - 常用设置和快捷键大全

    1. 让{ 和 } 不缩进 Options -> Document Options -> Auto Indenting -> Auto Indent Type 选 Simple 2. ...

  6. mvc路由参数注解

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); //过滤掉禁止访问的路由 routes.MapRoute( name: &quo ...

  7. C#整理 条件语句

    条件语句主要分为if else语句和switch case语句. if else语句主要分为四种格式: 1. if(表达式) {} 2.二选一 if(表达式) {} else {} 3.多选一 if( ...

  8. 实验六 多线程编程 1.随便选择两个城市作为预选旅游目标。实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市。分别用Runnable接口和Thread类实现。

    //继承Thread类 package zuoye; //继承Thread类 public class City extends Thread{ private String name; public ...

  9. events.js:72 throw er; // Unhandled 'error' event

    http://stackoverflow.com/questions/24525253/events-js72-throw-er-unhandled-error-event 出现了一个上述的错误. e ...

  10. 在VS中生成后拷贝文件

    环境:win7_64旗舰版,VS2013 工作项目中,一般会使用第三方库,当修改并重新编译第三方库后,需要将DLL文件拷贝到工作项目下的生成目录中,每次手动拷贝比较繁琐,VS提供自定义生成事件,允许我 ...