循环缓冲区的C语言实现

===============================   博客点滴积累,部分话语和知识点来源于网络,感谢网络资源的提供者======

    循环缓冲区对流数据异步处理有相当大的优势,C语言实现循环缓冲区,当缓冲区满时,数据将抛弃,不覆盖。代码如下:

#define  BUF_SIZE  1024
int fifo_arr[BUF_SIZE] = {}; 
unsigned int readops = 0;
unsigned int writeops = 0;
unsigned int empty = 0;
unsigned int full = 0;

/*
* 初始化函数,读写下标readops,writeops指向
* empty = 1,fifo为空;full = 0,fifo不满
*/
int init_fifo(void)
{

memset(fifo_arr,0, sizeof(fifo_arr));
readops = 0;
writeops = 0;
empty = 1;
full = 0;
return 0;

}

int read_fifo(int* arr,int len)
{

int can_readlen = 0; //可以读的长度

int readlen = 0;

int nextreadops = 0;

int i = 0;

readlen = len;

if(1 == empty)//为空则返回

{

return  -1;

}

if(readlen == 0)

{

return 0;

}

if(writeops > readops)

{

can_readlen = writeops - readops;

}

else if(writeops == readops)

{

can_readlen = BUF_SIZE;

}

else

{

can_readlen = BUF_SIZE - (readops - writeops);

}


if(readlen > can_readlen)

{

readlen = can_readlen;

}


nextreadops = (readops + readlen)%BUF_SIZE;

if(nextreadops == (readops + readlen))

{

for(i = 0; i < readlen ; i++)

{

arr[i]=fifo_arr[readops + i];

}

}

else

{

for(i = 0; i < readlen - nextreadops ; i++)

{

arr[i]=fifo_arr[readops + i];

}

for(i = 0; i < nextreadops ; i++)

{

arr[readlen - nextreadops + i]=fifo_arr[i];

}

}

readops = nextreadops;

if(writeops = readops)

{

empty = 1;// empty = 1,fifo为空;

}

full = 0;  //full = 0,fifo不满

return readlen;

}


int write_fifo(int* arr,int len)
{

int can_writelen = 0; //可以写的长度

int writelen = 0;

int nextwriteops = 0;

int i = 0;

writelen = len;

if(1 == full)//为满则返回

return  -1;

}


if(writelen == 0)

{

return 0;

}


if(writeops > readops)

{

can_writelen = BUF_SIZE - (writeops - readops);

}

else if(writeops == readops)

{

can_writelen = BUF_SIZE;

}

else

{

can_writelen = readops - writeops;

}



if(writelen > can_writelen)

{

writelen = can_writelen;

}


nextwriteops = (writeops + writelen)%BUF_SIZE;

if(nextwriteops == (readops + writelen))

{

for(i = 0; i < writelen ; i++)

{

fifo_arr[readops + i]=arr[i];

}

}

else

{

for(i = 0; i < writelen -nextwriteops ; i++)

{

fifo_arr[writeops + i] = arr[i];

}

for(i = 0; i <nextwriteops ; i++)

{

fifo_arr[i] = arr[writelen - nextwriteops + i];

}

}


writeops = nextwriteops;

if(writeops == readops)

{

full = 1; //full = 1,fifo满

}

empty = 0;//empty = 0,fifo不为空;

return writelen;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值