C#的MemoryStream用起来感觉不错,所以考虑C++实现一把.另外可以使用我上次写的一个类:CMemoryBuffer.先贴代码再解释吧.
头文件:
- #pragma once
- #include "MemoryBuffer.h"
- #include <string>
- #include <vector>
- using namespace std;
- #define _Base_Struct_Write_Func(_Struct_Type) void Write(const _Struct_Type &field)/
- {/
- Write((const BYTE*)&field,sizeof(_Struct_Type));/
- }/
- #define _Base_Struct_Read_Func(_Struct_Type) void Read( _Struct_Type &field)/
- {/
- Read(((BYTE*)&field),sizeof(_Struct_Type));/
- }/
- #define _Struct_Vector_Write_Func(_Struct_Type) void Write(vector<_Struct_Type> &vcts)/
- {/
- Write((int)vcts.size());/
- for (std::vector<_Struct_Type>::iterator iter = vcts.begin(); iter != vcts.end(); ++iter)/
- {/
- Write(*iter);/
- }/
- }/
- #define _Struct_Vector_Read_Func(_Struct_Type) void Read(vector<_Struct_Type> &vcts)/
- {/
- int iCnt = 0;/
- Read(iCnt);/
- if(iCnt <= 0) return;/
- _Struct_Type _Item;/
- for (int i = 0;i < iCnt; i ++)/
- {/
- Read(_Item);/
- vcts.push_back(_Item);/
- }/
- }/
- #define _Base_Struct_Read_Write_Func(_Struct_Type) _Base_Struct_Write_Func(_Struct_Type)/
- _Base_Struct_Read_Func(_Struct_Type)/
- _Struct_Vector_Write_Func(_Struct_Type)/
- _Struct_Vector_Read_Func(_Struct_Type)/
- class BaseClassDll_API CMemoryStream
- {
- //private:
- // CMemoryStream(void);
- public:
- // Summary:
- // Provides the fields that represent reference points in streams for seeking.
- enum SeekOrigin
- {
- // Summary:
- // Specifies the beginning of a stream.
- soBegin = 0,
- //
- // Summary:
- // Specifies the current position within a stream.
- soCurrent = 1,
- //
- // Summary:
- // Specifies the end of a stream.
- soEnd = 2,
- };
- public:
- CMemoryStream(CMemoryBuffer *tpbuffer);
- CMemoryStream();
- virtual ~CMemoryStream(void);
- static CMemoryStream * GetInstance(void);
- public:
- //基本结构
- _Base_Struct_Read_Write_Func(int)
- _Base_Struct_Read_Write_Func(unsigned int)
- _Base_Struct_Read_Write_Func(short)
- _Base_Struct_Read_Write_Func(unsigned short)
- _Base_Struct_Read_Write_Func(__int64)
- _Base_Struct_Read_Write_Func(unsigned __int64)
- _Base_Struct_Read_Write_Func(char)
- _Base_Struct_Read_Write_Func(unsigned char)
- _Base_Struct_Read_Write_Func(float)
- _Base_Struct_Read_Write_Func(double)
- _Base_Struct_Read_Write_Func(SYSTEMTIME)
- //字符串
- void Write(LPCWSTR szStr);
- void Write(LPCSTR szStr);
- void Write(const string &szStr);
- void Write(const wstring &szStr);
- void Write(const vector<string> &szStrVct);
- void Write(const vector<wstring> &szStrVct);
- void Read(string &tszStr);
- void Read(wstring &tszStr);
- void Read(string &tszStr,const int tiNumberofcharacter);
- void Read(wstring &tszStr,const int tiNumberofcharacter);
- void Read(vector<string> &szStrVct);
- void Read(vector<wstring> &szStrVct);
- //扩展类型
- void Write(const CMemoryBuffer &tbuffer);
- void Read(CMemoryBuffer &tbuffer);
- //字节流
- void Write(const BYTE * tpBytes , const int &tiLength);
- void Read(BYTE * tpBytes , const int tiLength);
- public:
- //Stream操作
- void Seek(int tioffset, SeekOrigin loc);
- int GetOffset()const{return this->m_iOffset;};
- int GetLength()const{return this->m_pBuffer->GetLength();};
- protected:
- CMemoryBuffer *m_pBuffer;
- int m_iOffset;
- };
CPP文件
- #include "StdAfx.h"
- #include "MemoryStream.h"
- CMemoryStream::CMemoryStream(void)
- {
- m_pBuffer = new CMemoryBuffer();
- m_iOffset = 0;
- }
- CMemoryStream::CMemoryStream(CMemoryBuffer *tpbuffer)
- {
- m_pBuffer = tpbuffer;
- m_iOffset = 0;
- }
- CMemoryStream * CMemoryStream::GetInstance()
- {
- CMemoryStream *pStream = new CMemoryStream(new CMemoryBuffer);
- return pStream;
- }
- CMemoryStream::~CMemoryStream(void)
- {
- if(m_pBuffer != NULL)
- delete m_pBuffer;
- m_pBuffer = NULL;
- }
- void CMemoryStream::Write(LPCWSTR szStr)
- {
- if (szStr == NULL )
- {
- return;
- }
- int iLength = (int)wcslen(szStr) * sizeof(wchar_t);
- Write(iLength);
- if (iLength != 0)
- {
- Write((const BYTE*)szStr,iLength);
- }
- }
- void CMemoryStream::Write(LPCSTR szStr)
- {
- if (szStr == NULL )
- {
- return;
- }
- int iLength = (int)strlen(szStr) * sizeof(char);
- Write(iLength);
- if (iLength != 0)
- {
- Write((const BYTE*)szStr,iLength);
- }
- }
- void CMemoryStream::Write(const string &szStr)
- {
- Write(szStr.c_str());
- }
- void CMemoryStream::Write(const vector<string> &szStrVct)
- {
- int iCnt = (int)szStrVct.size();
- Write(iCnt);
- for (int i = 0; i < (int)szStrVct.size(); i ++)
- {
- Write(szStrVct.at(i));
- }
- }
- void CMemoryStream::Write(const wstring &szStr)
- {
- Write(szStr.c_str());
- }
- void CMemoryStream::Write(const vector<wstring> &szStrVct)
- {
- int iCnt = (int)szStrVct.size();
- Write(iCnt);
- for (int i = 0; i < (int)szStrVct.size(); i ++)
- {
- Write(szStrVct.at(i));
- }
- }
- void CMemoryStream::Write(const CMemoryBuffer &field)
- {
- Write(field.GetLength());
- Write(field.c_Bytes(),field.GetLength());
- }
- void CMemoryStream::Write(const BYTE * tpBytes , const int &tiLength)
- {
- m_pBuffer->Insert(m_iOffset,tpBytes,tiLength);
- m_iOffset +=tiLength;
- }
- void CMemoryStream::Read( BYTE * tpBytes , const int tiLength)
- {
- if(tpBytes == NULL) return;
- if(m_iOffset + tiLength > m_pBuffer->GetLength()) return;
- memcpy((tpBytes),m_pBuffer->c_Bytes() + m_iOffset,tiLength);
- m_iOffset +=tiLength;
- }
- void CMemoryStream::Read(string &tszStr)
- {
- int iBytesCnt = 0;
- Read(iBytesCnt);
- if (iBytesCnt >= 0)
- {
- Read(tszStr,iBytesCnt);
- }
- }
- void CMemoryStream::Read(vector<string> &szStrVct)
- {
- int iCnt = 0;
- Read(iCnt);
- if (iCnt >= 0)
- {
- for (int i = 0; i < iCnt; i ++)
- {
- string temp;
- Read(temp);
- szStrVct.push_back(temp);
- }
- }
- }
- void CMemoryStream::Read(string &tszStr,const int tiNumberofcharacter)
- {
- char *pszTemp = new char[tiNumberofcharacter + 1];
- memset(pszTemp,0,(tiNumberofcharacter + 1) * sizeof(char));
- Read((BYTE*)pszTemp,(sizeof(char))*tiNumberofcharacter);
- tszStr = pszTemp;
- delete []pszTemp;
- }
- void CMemoryStream::Read(wstring &tszStr)
- {
- int iBytesCnt = 0;
- Read(iBytesCnt);
- if (iBytesCnt >= 0)
- {
- Read(tszStr,iBytesCnt / sizeof(wchar_t) );
- }
- }
- void CMemoryStream::Read(vector<wstring> &szStrVct)
- {
- int iCnt = 0;
- Read(iCnt);
- if (iCnt >= 0)
- {
- for (int i = 0; i < iCnt; i ++)
- {
- wstring temp;
- Read(temp);
- szStrVct.push_back(temp);
- }
- }
- }
- void CMemoryStream::Read(wstring &tszStr,const int tiNumberofcharacter)
- {
- wchar_t *pszTemp = new wchar_t[tiNumberofcharacter + 1];
- memset(pszTemp,0,(tiNumberofcharacter + 1) * sizeof(wchar_t));
- Read((BYTE*)pszTemp,(sizeof(wchar_t))*tiNumberofcharacter);
- tszStr = pszTemp;
- delete []pszTemp;
- }
- void CMemoryStream::Read( CMemoryBuffer &field)
- {
- int iBytesCnt = 0;
- Read(iBytesCnt);
- BYTE *pBytes = new BYTE[iBytesCnt];
- memset(pBytes,0,iBytesCnt);
- Read(pBytes,iBytesCnt);
- field.Append(pBytes,iBytesCnt);
- }
- void CMemoryStream::Seek(int tioffset, SeekOrigin loc)
- {
- switch(loc)
- {
- case soBegin:
- m_iOffset = tioffset;
- break;
- case soCurrent:
- m_iOffset += tioffset;
- break;
- case soEnd:
- m_iOffset = m_pBuffer->GetLength();
- break;
- }
- }
用法举例
- string s1("1111");
- CMemoryStream temp_ms;
- temp_ms.Write(s1);
- temp_ms.Seek(0,CMemoryStream::soBegin);
- string s2;
- temp_ms.Read(s2);
- ASSERT(s1 == s2);
支持大部分类型,如果你有自定义类型,可以在以上基础扩充.