C语言环形buffer

本文介绍了如何在C语言中实现环形数组,即环形缓冲区。作者分享了在编写过程中的难点,如指针操作的复杂性,以及在实现过程中遇到的问题。文章提供了初始化、创建、删除环形存储区以及读写数据等关键函数的实现,并通过主函数进行验证。
摘要由CSDN通过智能技术生成

C语言环形数组

  • 这是一个循环缓冲区,终于写完了,指针指来指取还是很麻烦的,稍微不注意就出错了
    但是思路还是挺简单的,不过对于小白的我还是用了蛮久的时间的,关键是开始没有构思好
    所以出了很多问题,这是最终版本,以后希望对自己有用,今天是2019.7.25 大吉大利的晚上,各位加油

  • 头文件

#include<stdio.h>
#include <string.h>
  • 函数声明和环形存储区的建立,环形结构体指针的声明
  • 在这里我将以数组作为环形存储区的存储区域,在这里也可以用动态申请内存,这里设置的类型也是int 这里可以根据自己需要更改数据类型,或者定义为一个void *类型,函数的功能就更强大了,不够后面要强制转换,我是个小白,所以以比较简单的想法写的,
#define RB_MAX_LEN    10
typedef unsigned int uint_t;
typedef struct
{
	uint_t sizerb;
	int *write;
	int *read;
	int *buffer;
	uint_t rw;//0代表已经读    1代表已经写,
	
}rb_t;
rb_t rb;
static uint_t rbBuf[RB_MAX_LEN];  

void creatrb(rb_t* rb);


  • 初始化一个环形存储区域

void buff_init(void)
{
	rb.sizerb = RB_MAX_LEN;     //定义长度
	rb.buffer = rbBuf;			//将申请的一个空间的首地址给buffer
	creatrb(&rb);				//然后运行创建函数
	
}
  • 创建一个环形存储区
void creatrb(rb_t* rb)
{
	if(NULL == rb)   //判断指针是否为空
	{
		printf("fault\n");
		return;
	}
    rb->write= rb->buffer;			//将读和写都指向首地址,创建完毕
	rb->read = rb->buffer;
	rb->rw   =0;

}
  • 删除环形存储区
static void deleterb(rb_t *rb)
{
	if(NULL == rb)
	{
		printf("error");
	}
	rb->write = NULL;
	rb->read  = NULL;
	rb->buffer= NULL;
	rb->sizerb = 0;
	rb->rw   =0;
	
}
  • 获取存储区域大小
static uint_t getrb_capacity(rb_t *rb)
{
	if(NULL == rb)   //判断指针是否为空
	{
		printf("fault\n");
		return -1;
	}
	return rb->sizer
下面是一个简单的环形缓冲区实现,使用C语言编写: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char *data; int head; int tail; int size; } CircularBuffer; CircularBuffer* createCircularBuffer(int size) { CircularBuffer *buffer = (CircularBuffer*)malloc(sizeof(CircularBuffer)); buffer->data = (char*)malloc(sizeof(char) * size); buffer->head = 0; buffer->tail = 0; buffer->size = size; return buffer; } void destroyCircularBuffer(CircularBuffer *buffer) { free(buffer->data); free(buffer); } int isEmpty(CircularBuffer *buffer) { return buffer->head == buffer->tail; } int isFull(CircularBuffer *buffer) { return (buffer->tail + 1) % buffer->size == buffer->head; } int write(CircularBuffer *buffer, char *data, int len) { if (isFull(buffer)) { return 0; } int i; for (i=0; i<len; i++) { buffer->data[buffer->tail] = data[i]; buffer->tail = (buffer->tail + 1) % buffer->size; } return len; } int read(CircularBuffer *buffer, char *data, int len) { if (isEmpty(buffer)) { return 0; } int i; for (i=0; i<len; i++) { data[i] = buffer->data[buffer->head]; buffer->head = (buffer->head + 1) % buffer->size; if (buffer->head == buffer->tail) { break; } } return i; } int main() { CircularBuffer *buffer = createCircularBuffer(10); char *data1 = "hello"; char *data2 = "world"; char *data3 = "this is a test"; write(buffer, data1, strlen(data1)); write(buffer, data2, strlen(data2)); write(buffer, data3, strlen(data3)); char read_data[20]; int len = read(buffer, read_data, 20); read_data[len] = '\0'; printf("%s\n", read_data); destroyCircularBuffer(buffer); return 0; } ``` 这个实现中,我们使用一个结构体来表示环形缓冲区,其中包括一个指针、头和尾指针、缓冲大小等信息。为了实现环形缓冲区,我们使用了取模运算来计算下一个指针的位置。在 `write` 函数中,我们将数据写入缓冲的尾部;在 `read` 函数中,我们从缓冲的头部读取数据。在 `main` 函数中,我们展示了如何使用这个环形缓冲区来写入和读取数据。 需要注意的是,在使用环形缓冲区时需要考虑读写指针的同步问题,避免数据的丢失或覆盖。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值