C++实现的CMemoryStream类

来源:互联网 发布:淘宝网冬季运动球衫 编辑:程序博客网 时间:2024/05/16 04:42
转自 http://blog.csdn.net/athlong0564/article/details/5942375
C++实现的CMemoryStream类
分类: C++文章 260人阅读 评论(1) 收藏 举报
c++structvectorbytestringnull

   C#的MemoryStream用起来感觉不错,所以考虑C++实现一把.另外可以使用我上次写的一个类:CMemoryBuffer.先贴代码再解释吧.

   头文件:

  

[cpp] view plaincopy
  1. #pragma once  
  2.   
  3. #include "MemoryBuffer.h"  
  4.   
  5. #include <string>  
  6. #include <vector>  
  7. using namespace std;  
  8.   
  9. #define _Base_Struct_Write_Func(_Struct_Type)   void Write(const _Struct_Type &field)/  
  10.                                                 {/  
  11.                                                     Write((const BYTE*)&field,sizeof(_Struct_Type));/  
  12.                                                 }/  
  13.   
  14. #define _Base_Struct_Read_Func(_Struct_Type)    void Read( _Struct_Type &field)/  
  15.                                                 {/  
  16.                                                     Read(((BYTE*)&field),sizeof(_Struct_Type));/  
  17.                                                 }/  
  18.   
  19. #define _Struct_Vector_Write_Func(_Struct_Type) void Write(vector<_Struct_Type> &vcts)/  
  20.                                                 {/  
  21.                                                     Write((int)vcts.size());/  
  22.                                                     for (std::vector<_Struct_Type>::iterator iter = vcts.begin(); iter != vcts.end(); ++iter)/  
  23.                                                     {/  
  24.                                                         Write(*iter);/  
  25.                                                     }/  
  26.                                                 }/  
  27.   
  28. #define _Struct_Vector_Read_Func(_Struct_Type) void Read(vector<_Struct_Type> &vcts)/  
  29.                                                 {/  
  30.                                                     int iCnt = 0;/  
  31.                                                     Read(iCnt);/  
  32.                                                     if(iCnt <= 0) return;/  
  33.                                                     _Struct_Type _Item;/  
  34.                                                     for (int i = 0;i < iCnt; i ++)/  
  35.                                                     {/  
  36.                                                         Read(_Item);/  
  37.                                                         vcts.push_back(_Item);/  
  38.                                                     }/  
  39.                                                     }/  
  40.   
  41. #define _Base_Struct_Read_Write_Func(_Struct_Type)  _Base_Struct_Write_Func(_Struct_Type)/  
  42.                                                     _Base_Struct_Read_Func(_Struct_Type)/  
  43.                                                     _Struct_Vector_Write_Func(_Struct_Type)/  
  44.                                                     _Struct_Vector_Read_Func(_Struct_Type)/  
  45.   
  46. class BaseClassDll_API CMemoryStream  
  47. {  
  48. //private:  
  49. //  CMemoryStream(void);  
  50. public:  
  51.     // Summary:  
  52.     //     Provides the fields that represent reference points in streams for seeking.  
  53.     enum SeekOrigin  
  54.     {  
  55.         // Summary:  
  56.         //     Specifies the beginning of a stream.  
  57.         soBegin = 0,  
  58.         //  
  59.         // Summary:  
  60.         //     Specifies the current position within a stream.  
  61.         soCurrent = 1,  
  62.         //  
  63.         // Summary:  
  64.         //     Specifies the end of a stream.  
  65.         soEnd = 2,  
  66.     };  
  67. public:  
  68.     CMemoryStream(CMemoryBuffer *tpbuffer);  
  69.     CMemoryStream();  
  70.     virtual ~CMemoryStream(void);  
  71.   
  72.     static CMemoryStream * GetInstance(void);  
  73.   
  74. public:  
  75.    //基本结构  
  76.    _Base_Struct_Read_Write_Func(int)  
  77.    _Base_Struct_Read_Write_Func(unsigned int)  
  78.    _Base_Struct_Read_Write_Func(short)  
  79.    _Base_Struct_Read_Write_Func(unsigned short)  
  80.    _Base_Struct_Read_Write_Func(__int64)  
  81.    _Base_Struct_Read_Write_Func(unsigned __int64)  
  82.    _Base_Struct_Read_Write_Func(char)  
  83.    _Base_Struct_Read_Write_Func(unsigned char)  
  84.    _Base_Struct_Read_Write_Func(float)  
  85.    _Base_Struct_Read_Write_Func(double)  
  86.    _Base_Struct_Read_Write_Func(SYSTEMTIME)  
  87.   //字符串  
  88.     void Write(LPCWSTR szStr);  
  89.     void Write(LPCSTR szStr);  
  90.     void Write(const string &szStr);  
  91.     void Write(const wstring &szStr);  
  92.     void Write(const vector<string> &szStrVct);  
  93.     void Write(const vector<wstring> &szStrVct);  
  94.   
  95.     void Read(string &tszStr);  
  96.     void Read(wstring &tszStr);  
  97.     void Read(string &tszStr,const int tiNumberofcharacter);  
  98.     void Read(wstring &tszStr,const int tiNumberofcharacter);  
  99.     void Read(vector<string> &szStrVct);  
  100.     void Read(vector<wstring> &szStrVct);  
  101.    //扩展类型  
  102.     void Write(const CMemoryBuffer &tbuffer);  
  103.     void Read(CMemoryBuffer &tbuffer);  
  104.     //字节流  
  105.     void Write(const BYTE * tpBytes , const int &tiLength);  
  106.     void Read(BYTE * tpBytes , const int tiLength);  
  107. public:  
  108.     //Stream操作  
  109.     void Seek(int tioffset, SeekOrigin loc);  
  110.     int GetOffset()const{return this->m_iOffset;};  
  111.     int GetLength()const{return this->m_pBuffer->GetLength();};  
  112.   
  113.   
  114. protected:  
  115.     CMemoryBuffer *m_pBuffer;  
  116.     int m_iOffset;  
  117. };  

   CPP文件

  

[cpp] view plaincopy
  1. #include "StdAfx.h"  
  2. #include "MemoryStream.h"  
  3.   
  4. CMemoryStream::CMemoryStream(void)  
  5. {  
  6.     m_pBuffer = new CMemoryBuffer();  
  7.     m_iOffset = 0;  
  8. }  
  9.   
  10. CMemoryStream::CMemoryStream(CMemoryBuffer *tpbuffer)  
  11. {  
  12.     m_pBuffer = tpbuffer;  
  13.     m_iOffset = 0;  
  14. }  
  15.   
  16. CMemoryStream * CMemoryStream::GetInstance()  
  17. {  
  18.     CMemoryStream *pStream = new CMemoryStream(new CMemoryBuffer);  
  19.     return pStream;  
  20. }  
  21.   
  22.   
  23.   
  24. CMemoryStream::~CMemoryStream(void)  
  25. {  
  26.     if(m_pBuffer != NULL)  
  27.         delete m_pBuffer;  
  28.     m_pBuffer = NULL;  
  29. }  
  30.   
  31. void CMemoryStream::Write(LPCWSTR szStr)  
  32. {  
  33.     if (szStr == NULL )  
  34.     {  
  35.         return;  
  36.     }  
  37.     int iLength = (int)wcslen(szStr) * sizeof(wchar_t);  
  38.     Write(iLength);  
  39.     if (iLength != 0)  
  40.     {  
  41.         Write((const BYTE*)szStr,iLength);  
  42.     }  
  43. }  
  44.   
  45. void CMemoryStream::Write(LPCSTR szStr)  
  46. {  
  47.     if (szStr == NULL )  
  48.     {  
  49.         return;  
  50.     }  
  51.     int iLength = (int)strlen(szStr) * sizeof(char);  
  52.     Write(iLength);  
  53.     if (iLength != 0)  
  54.     {  
  55.         Write((const BYTE*)szStr,iLength);  
  56.     }  
  57. }  
  58.   
  59.   
  60. void CMemoryStream::Write(const string &szStr)  
  61. {  
  62.     Write(szStr.c_str());  
  63. }  
  64.   
  65. void CMemoryStream::Write(const vector<string> &szStrVct)  
  66. {  
  67.     int iCnt = (int)szStrVct.size();  
  68.     Write(iCnt);  
  69.     for (int i = 0; i < (int)szStrVct.size(); i ++)  
  70.     {  
  71.         Write(szStrVct.at(i));  
  72.     }  
  73. }  
  74.   
  75.   
  76. void CMemoryStream::Write(const wstring &szStr)  
  77. {  
  78.     Write(szStr.c_str());  
  79. }  
  80.   
  81. void CMemoryStream::Write(const vector<wstring> &szStrVct)  
  82. {  
  83.     int iCnt = (int)szStrVct.size();  
  84.     Write(iCnt);  
  85.     for (int i = 0; i < (int)szStrVct.size(); i ++)  
  86.     {  
  87.         Write(szStrVct.at(i));  
  88.     }  
  89. }  
  90.   
  91.   
  92.   
  93.   
  94. void CMemoryStream::Write(const CMemoryBuffer &field)  
  95. {  
  96.     Write(field.GetLength());  
  97.     Write(field.c_Bytes(),field.GetLength());  
  98. }  
  99.   
  100.   
  101. void CMemoryStream::Write(const BYTE * tpBytes , const int &tiLength)  
  102. {  
  103.     m_pBuffer->Insert(m_iOffset,tpBytes,tiLength);  
  104.     m_iOffset +=tiLength;  
  105. }  
  106.   
  107. void CMemoryStream::Read( BYTE * tpBytes , const int tiLength)  
  108. {  
  109.     if(tpBytes == NULL) return;  
  110.     if(m_iOffset + tiLength > m_pBuffer->GetLength()) return;  
  111.     memcpy((tpBytes),m_pBuffer->c_Bytes() + m_iOffset,tiLength);  
  112.     m_iOffset +=tiLength;  
  113. }  
  114.   
  115. void CMemoryStream::Read(string &tszStr)  
  116. {  
  117.     int iBytesCnt = 0;  
  118.     Read(iBytesCnt);  
  119.     if (iBytesCnt >= 0)  
  120.     {  
  121.         Read(tszStr,iBytesCnt);  
  122.     }  
  123. }  
  124.   
  125. void CMemoryStream::Read(vector<string> &szStrVct)  
  126. {  
  127.     int iCnt = 0;  
  128.     Read(iCnt);  
  129.     if (iCnt >= 0)  
  130.     {  
  131.         for (int i = 0; i < iCnt; i ++)  
  132.         {  
  133.             string temp;  
  134.             Read(temp);  
  135.             szStrVct.push_back(temp);  
  136.         }  
  137.     }  
  138. }  
  139.   
  140.   
  141. void CMemoryStream::Read(string &tszStr,const int tiNumberofcharacter)  
  142. {  
  143.     char *pszTemp = new char[tiNumberofcharacter + 1];  
  144.     memset(pszTemp,0,(tiNumberofcharacter + 1) * sizeof(char));  
  145.     Read((BYTE*)pszTemp,(sizeof(char))*tiNumberofcharacter);  
  146.     tszStr = pszTemp;  
  147.     delete []pszTemp;  
  148. }  
  149.   
  150. void CMemoryStream::Read(wstring &tszStr)  
  151. {  
  152.     int iBytesCnt = 0;  
  153.     Read(iBytesCnt);  
  154.     if (iBytesCnt >= 0)  
  155.     {  
  156.         Read(tszStr,iBytesCnt / sizeof(wchar_t) );  
  157.     }  
  158. }  
  159.   
  160. void CMemoryStream::Read(vector<wstring> &szStrVct)  
  161. {  
  162.     int iCnt = 0;  
  163.     Read(iCnt);  
  164.     if (iCnt >= 0)  
  165.     {  
  166.         for (int i = 0; i < iCnt; i ++)  
  167.         {  
  168.             wstring temp;  
  169.             Read(temp);  
  170.             szStrVct.push_back(temp);  
  171.         }  
  172.     }  
  173. }  
  174.   
  175. void CMemoryStream::Read(wstring &tszStr,const int tiNumberofcharacter)  
  176. {  
  177.     wchar_t *pszTemp = new wchar_t[tiNumberofcharacter + 1];  
  178.     memset(pszTemp,0,(tiNumberofcharacter + 1) * sizeof(wchar_t));  
  179.     Read((BYTE*)pszTemp,(sizeof(wchar_t))*tiNumberofcharacter);  
  180.     tszStr = pszTemp;  
  181.     delete []pszTemp;  
  182. }  
  183.   
  184. void CMemoryStream::Read( CMemoryBuffer &field)  
  185. {  
  186.     int iBytesCnt = 0;  
  187.     Read(iBytesCnt);  
  188.     BYTE *pBytes = new BYTE[iBytesCnt];  
  189.     memset(pBytes,0,iBytesCnt);  
  190.     Read(pBytes,iBytesCnt);  
  191.     field.Append(pBytes,iBytesCnt);  
  192. }  
  193.   
  194.   
  195.   
  196.   
  197.   
  198. void CMemoryStream::Seek(int tioffset, SeekOrigin loc)  
  199. {  
  200.     switch(loc)  
  201.     {  
  202.     case soBegin:  
  203.         m_iOffset = tioffset;  
  204.         break;  
  205.     case soCurrent:  
  206.         m_iOffset += tioffset;  
  207.         break;  
  208.     case soEnd:  
  209.         m_iOffset = m_pBuffer->GetLength();  
  210.         break;  
  211.     }  
  212. }  

 

  用法举例

 

[cpp] view plaincopy
  1. string s1("1111");  
  2. CMemoryStream temp_ms;  
  3. temp_ms.Write(s1);  
  4. temp_ms.Seek(0,CMemoryStream::soBegin);  
  5. string s2;  
  6. temp_ms.Read(s2);  
  7. ASSERT(s1 == s2);  

  支持大部分类型,如果你有自定义类型,可以在以上基础扩充.

 

0 0
原创粉丝点击