循环缓冲区类
来源:互联网 发布:财经数据接口 编辑:程序博客网 时间:2024/05/19 15:22
一个循环缓冲区的实现类。
思路:分配一个固定缓冲区,利用缓冲区读写数据。当写到缓冲区底部而读指针不在缓冲区顶部时,则写指针移动到缓冲区顶部,继续写操作。
//InSream.h
#include <windows.h>
#pragma once
class InSream//循环堆栈
{
BYTE* pBuf;
BYTE* pReadCursor;
BYTE* pWriteCursor;
long nBufSize;
public:
InSream();
virtual ~InSream();
BOOL SetBufSize(UINT _size);
BOOL Create();
BYTE* GetBuf(){return pBuf;};
BYTE* GetReadCursor(){return pReadCursor;};
BYTE* GetWriteCursor(){return pWriteCursor;};
BOOL PushByte(BYTE* pData,long bufLen);
BOOL PopByte(BYTE* pData,long bufLen);
long GetDataLen();
};
//InSream.cpp
#include "stdafx.h"
#include "InStream.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
InSream::InSream()
{
nBufSize=0;
pBuf=NULL;
pReadCursor=NULL;
pWriteCursor=NULL;
}
InSream::~InSream()
{
if(pBuf)free(pBuf);
}
InSream::SetBufSize(UINT _size)
{
if(nBufSize==0)
{
nBufSize=_size;
return true;
}
return false;
}
InSream::Create()
{
pBuf=new BYTE[nBufSize+1];
pReadCursor=pBuf;
pWriteCursor=pBuf;
return true;
}
BOOL InSream::PushByte(BYTE* pData,long bufLen)
{
if(nBufSize-GetDataLen()-bufLen<0)return false;//缓冲区满
long c=pWriteCursor-pReadCursor;
if(c<0)
{
long h=c-1;
if(h>=bufLen)
{
memcpy(pWriteCursor,pData,bufLen);
pWriteCursor+=bufLen;
return true;
}
return false;
}
if(c==0)//栈空
{
pWriteCursor=pBuf;
pReadCursor=pBuf;
memcpy(pWriteCursor,pData,bufLen);
pWriteCursor+=bufLen;
return true;
}
if(c>0)
{
long h=pBuf+nBufSize-pWriteCursor+1;
if(h>bufLen)
{
memcpy(pWriteCursor,pData,bufLen);
pWriteCursor+=bufLen;
return true;
}
if(h==bufLen)
{
memcpy(pWriteCursor,pData,bufLen);
pWriteCursor=pBuf;
return true;
}
if(h<bufLen)
{
memcpy(pWriteCursor,pData,h);
pData+=h;
bufLen-=h;
pWriteCursor=pBuf;
memcpy(pWriteCursor,pData,h);
pWriteCursor+=h;
return true;
}
}
return false;
}
BOOL InSream::PopByte(BYTE* pData,long bufLen)
{
if(bufLen==0)return true;
if(GetDataLen()<bufLen)return false;//缓冲区空
long c=pWriteCursor-pReadCursor;
if(c<0)
{
long h=pBuf+nBufSize-pReadCursor+1;
if(h>bufLen)
{
memcpy(pData,pReadCursor,bufLen);
pReadCursor+=bufLen;
return true;
}
if(h==bufLen)
{
memcpy(pData,pReadCursor,bufLen);
pReadCursor=pBuf;
return true;
}
if(h<bufLen)
{
memcpy(pData,pReadCursor,h);
pData+=h;
bufLen-=h;
pReadCursor=pBuf;
memcpy(pData,pReadCursor,bufLen);
pReadCursor+=bufLen;
return true;
}
}
if(c>0)
{
long h=c;
if(h>=bufLen)
{
memcpy(pData,pReadCursor,bufLen);
pReadCursor+=bufLen;
return true;
}
return false;
}
return false;
}
long InSream::GetDataLen()
{
long DateLen=pWriteCursor-pReadCursor;
if(DateLen<0)
{
DateLen=nBufSize-DateLen;
}
return DateLen;
}
- 循环缓冲区类
- C++版循环缓冲区类
- C++版循环缓冲区类
- 循环缓冲区
- 循环缓冲区
- 循环缓冲区
- 通用循环缓冲区类(c++版)
- linux c++循环缓冲区模板类
- 键盘输入循环缓冲区问题
- 队列实现循环缓冲区
- 循环缓冲区的定义
- boost 循环缓冲区
- Linux中的循环缓冲区
- Android 循环缓冲区
- 队列实现循环缓冲区
- C++版的循环缓冲区类(实际测试可用!)
- 循环缓冲区的一点笔记
- Linux内核中的循环缓冲区
- 要学会充实自己
- 在Visual C++中用ADO进行数据库编程(下)
- spring EJB JNDI
- 我的google广告计划
- ADO.NET使用经验集
- 循环缓冲区类
- 几种VC++数据库开发技术的比较
- ado 连接 paradox db数据库
- 用VC++6.0开发多表联接的数据库应用程序
- VC数据库编程中的打印控制
- ODBC基本概念
- VC中利用ADO共同实现数据库的操作
- Several workaround in mips simulation of SkyEye
- Visual C++中实现对图像数据的读取显示