请用C语言实现一个可自定义数据区大小的环形缓冲
时间: 2024-05-01 17:17:25 浏览: 10
区。
很高兴听到您的问题。以下是 C 语言实现可自定义数据区大小的环形缓冲区的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
unsigned char *buffer;
unsigned int head;
unsigned int tail;
unsigned int size;
} CircularBuffer;
CircularBuffer* create_buffer(unsigned int size) {
CircularBuffer *b = (CircularBuffer*)malloc(sizeof(CircularBuffer));
b->buffer = (unsigned char*)malloc(size);
b->size = size;
b->head = b->tail = 0;
return b;
}
void destroy_buffer(CircularBuffer *b) {
free(b->buffer);
free(b);
}
int is_full(CircularBuffer *b) {
return (b->head - b->tail) % b->size == b->size - 1;
}
int is_empty(CircularBuffer *b) {
return b->head == b->tail;
}
int get_count(CircularBuffer *b) {
return (b->head - b->tail + b->size) % b->size;
}
int write_data(CircularBuffer *b, unsigned char *data, unsigned int len) {
int i;
for (i = 0; i < len; i++) {
if (is_full(b)) {
return i;
}
b->buffer[b->head] = data[i];
b->head = (b->head + 1) % b->size;
}
return len;
}
int read_data(CircularBuffer *b, unsigned char *data, unsigned int len) {
int i;
for (i = 0; i < len; i++) {
if (is_empty(b)) {
return i;
}
data[i] = b->buffer[b->tail];
b->tail = (b->tail + 1) % b->size;
}
return len;
}
int main() {
CircularBuffer *b = create_buffer(10);
unsigned char data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
unsigned char out[10];
int count, i;
count = write_data(b, data, sizeof(data));
printf("write %d bytes\n", count);
count = read_data(b, out, 8);
printf("read %d bytes: ", count);
for (i = 0; i < count; i++) {
printf("%d ", out[i]);
}
printf("\n");
count = write_data(b, &data[8], 7);
printf("write %d bytes\n", count);
count = read_data(b, out, 10);
printf("read %d bytes: ", count);
for (i = 0; i < count; i++) {
printf("%d ", out[i]);
}
printf("\n");
destroy_buffer(b);
return 0;
}
```
这个示例代码实现了一个长度为 10 的环形缓冲区,可以通过 `create_buffer` 函数创建,通过 `destroy_buffer` 函数销毁。数据的读写通过 `read_data` 和 `write_data` 函数实现。可以通过修改 `size` 参数来调整缓冲区的大小。在缓冲区已满或已空时,写操作或读操作将返回已写或已读的字节数。
请注意,这只是一个示例代码,可能存在一些问题或局限性,例如,它是单线程环境下的使用,如果需要在多线程环境中使用,需要加锁等措施确保线程安全。