实现环形缓冲区(循环队列)的 C 语言程序,
支持覆盖读写的功能。
环形缓冲区通常用于实现生产者-消费者模型或者数据流处理。
以下是一个简单的示例代码:
#include <stdio.h>
#include <stdlib.h>
#define BUFFER_SIZE 10
// 定义环形缓冲区结构体
typedef struct {
int *buffer; // 缓冲区数组指针
int size; // 缓冲区大小
int head; // 头部指针,指向下一个要写入的位置
int tail; // 尾部指针,指向下一个要读取的位置
} CircularBuffer;
// 初始化环形缓冲区
void initCircularBuffer(CircularBuffer *cb) {
cb->buffer = (int *)malloc(BUFFER_SIZE * sizeof(int));
cb->size = BUFFER_SIZE;
cb->head = 0;
cb->tail = 0;
}
// 写入数据到环形缓冲区
void writeCircularBuffer(CircularBuffer *cb, int data) {
cb->buffer[cb->head] = data;
cb->head = (cb->head + 1) % cb->size; // 更新头部指针,实现环形特性
if (cb->head == cb->tail) {
cb->tail = (cb->tail + 1) % cb->size; // 如果头部追上尾部,尾部指针后移(覆盖最老的数据)
}
}
// 从环形缓冲区读取数据
int readCircularBuffer(CircularBuffer *cb) {
if (cb->head == cb->tail) {
printf("Buffer is empty.\n");
return -1;
}
int data = cb->buffer[cb->tail];
cb->tail = (cb->tail + 1) % cb->size; // 更新尾部指针
return data;
}
// 释放环形缓冲区内存
void freeCircularBuffer(CircularBuffer *cb) {
free(cb->buffer);
}
int main() {
CircularBuffer cb;
initCircularBuffer(&cb);
// 写入数据到环形缓冲区
writeCircularBuffer(&cb, 1);
writeCircularBuffer(&cb, 2);
writeCircularBuffer(&cb, 3);
// 读取数据并打印
printf("Read: %d\n", readCircularBuffer(&cb));
printf("Read: %d\n", readCircularBuffer(&cb));
// 再次写入数据
writeCircularBuffer(&cb, 4);
// 读取数据并打印
printf("Read: %d\n", readCircularBuffer(&cb));
printf("Read: %d\n", readCircularBuffer(&cb));
freeCircularBuffer(&cb);
return 0;
}
在这个示例中,我们定义了一个 CircularBuffer 结构体来表示环形缓冲区。i nitCircularBuffer 函数用于初始化环形缓冲区,
writeCircularBuffer 函数用于向缓冲区写入数据,
并实现了覆盖写功能,即当头部指针追上尾部指针时,尾部指针向后移动。
readCircularBuffer 函数用于从缓冲区读取数据,并更新尾部指针。
在 main 函数中,我们展示了如何使用这些函数来进行数据的写入和读取,并演示了当缓冲区满时如何覆盖写入最老的数据。
1万+

被折叠的 条评论
为什么被折叠?



