高效C语言循环buffer
时间: 2023-07-01 22:24:28 浏览: 104
循环缓冲区(Circular Buffer)是一种环形的数据结构,常用于实现数据的异步传输、数据缓存、数据流控制等场景。在 C 语言中,可以通过使用指针和数组来实现循环缓冲区。
以下是一份高效的 C 语言循环缓冲区的实现代码:
```c
typedef struct {
char *buffer;
size_t size;
size_t read_pos;
size_t write_pos;
} CircularBuffer;
CircularBuffer *cb_new(size_t size) {
CircularBuffer *cb = (CircularBuffer *) malloc(sizeof(CircularBuffer));
cb->buffer = (char *) malloc(size);
cb->size = size;
cb->read_pos = 0;
cb->write_pos = 0;
return cb;
}
void cb_free(CircularBuffer *cb) {
free(cb->buffer);
free(cb);
}
size_t cb_size(CircularBuffer *cb) {
return cb->write_pos - cb->read_pos;
}
size_t cb_capacity(CircularBuffer *cb) {
return cb->size - cb_size(cb);
}
size_t cb_write(CircularBuffer *cb, const char *data, size_t len) {
size_t capacity = cb_capacity(cb);
if (len > capacity) {
len = capacity;
}
size_t right = cb->size - cb->write_pos;
if (len <= right) {
memcpy(cb->buffer + cb->write_pos, data, len);
cb->write_pos += len;
} else {
memcpy(cb->buffer + cb->write_pos, data, right);
memcpy(cb->buffer, data + right, len - right);
cb->write_pos = len - right;
}
return len;
}
size_t cb_read(CircularBuffer *cb, char *data, size_t len) {
size_t size = cb_size(cb);
if (len > size) {
len = size;
}
size_t right = cb->size - cb->read_pos;
if (len <= right) {
memcpy(data, cb->buffer + cb->read_pos, len);
cb->read_pos += len;
} else {
memcpy(data, cb->buffer + cb->read_pos, right);
memcpy(data + right, cb->buffer, len - right);
cb->read_pos = len - right;
}
return len;
}
```
在上述代码中,`CircularBuffer` 结构体表示循环缓冲区,包含 `buffer`(存储数据的数组指针)、`size`(缓冲区大小)、`read_pos`(读指针位置)和 `write_pos`(写指针位置)四个成员变量。通过 `cb_new()` 函数创建一个新的循环缓冲区,通过 `cb_free()` 函数释放一个已有的循环缓冲区。`cb_size()` 函数返回当前缓冲区中的数据大小,`cb_capacity()` 函数返回缓冲区中还能存储的数据大小。`cb_write()` 函数向缓冲区中写入数据,`cb_read()` 函数从缓冲区中读取数据。
在 `cb_write()` 和 `cb_read()` 函数中,通过判断写指针和读指针的位置关系,实现数据的循环存储和读取。如果写指针位置超出缓冲区末尾,则从缓冲区头部继续写入;如果读指针位置超出缓冲区末尾,则从缓冲区头部继续读取。这样可以实现数据的循环存储和读取,提高缓冲区的利用效率。
需要注意的是,在使用循环缓冲区时需要注意指针位置的变化,避免出现指针越界等错误。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)