【随手笔记】环形缓冲区之覆盖读写

实现环形缓冲区(循环队列)的 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 函数中,我们展示了如何使用这些函数来进行数据的写入和读取,并演示了当缓冲区满时如何覆盖写入最老的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值