C语言ring_buffer代码实现
时间: 2024-10-13 09:14:38 浏览: 11
Ring Buffer(环形缓冲区)是一种特殊的缓冲区结构,数据的写入端总是追加到缓冲区的尾部,而读取端则从缓冲区头部开始。当一个新元素写入时,如果已满,则会替换掉最早进入缓冲区的数据,形成循环效果。下面是C语言中一个简单的环形缓冲区实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define BUFFER_SIZE 10 // 缓冲区大小
typedef struct {
int data[BUFFER_SIZE];
int head; // 当前写入位置
int tail; // 当前读取位置
} RingBuffer;
// 初始化环形缓冲区
RingBuffer* ring_buffer_init() {
RingBuffer* rb = malloc(sizeof(RingBuffer));
if (rb == NULL) {
perror("Memory allocation failed");
exit(EXIT_FAILURE);
}
rb->head = 0;
rb->tail = 0;
return rb;
}
// 写入数据到环形缓冲区
void ring_buffer_write(RingBuffer* rb, int value) {
rb->data[rb->head] = value;
rb->head = (rb->head + 1) % BUFFER_SIZE;
}
// 读取环形缓冲区数据
int ring_buffer_read(RingBuffer* rb) {
if (rb->head == rb->tail) { // 空缓冲区
return -1;
} else {
rb->tail = (rb->tail + 1) % BUFFER_SIZE; // 移动读指针
return rb->data[rb->tail];
}
}
// 检查环形缓冲区是否为空
int ring_buffer_empty(const RingBuffer* rb) {
return rb->head == rb->tail;
}
// 清空环形缓冲区
void ring_buffer_clear(RingBuffer* rb) {
rb->head = 0;
rb->tail = 0;
}
// 释放环形缓冲区内存
void ring_buffer_destroy(RingBuffer* rb) {
free(rb);
}
int main() {
RingBuffer* rb = ring_buffer_init();
// 使用环形缓冲区...
ring_buffer_write(rb, 1);
ring_buffer_write(rb, 2);
printf("%d\n", ring_buffer_read(rb)); // 输出 1
ring_buffer_clear(rb);
// 结束后记得释放资源
ring_buffer_destroy(rb);
return 0;
}
```
在这个例子中,`ring_buffer_write()`负责向缓冲区添加数据,`ring_buffer_read()`从缓冲区取出数据,`ring_buffer_empty()`检查是否有可用的数据,`ring_buffer_clear()`清空缓冲区内容,`ring_buffer_destroy()`释放内存。
阅读全文