C语言实现ringbuffer,并使用
时间: 2024-02-03 08:11:45 浏览: 27
Ring buffer(环形缓冲区)是一种数据结构,它可以在固定的内存空间中存储一定量的数据。它有一个读指针和一个写指针,当写指针到达缓冲区的末尾时,它会从缓冲区的开头重新开始写入数据。这种数据结构常用于实现异步数据传输。
下面是一个简单的 C 语言实现 ring buffer 的示例:
```c
#include <stdio.h>
#include <stdlib.h>
#define BUFFER_SIZE 10
typedef struct {
char *data;
int read_ptr;
int write_ptr;
} ring_buffer;
void rb_init(ring_buffer *rb) {
rb->data = (char *) malloc(BUFFER_SIZE);
rb->read_ptr = 0;
rb->write_ptr = 0;
}
int rb_write(ring_buffer *rb, char *data, int len) {
int i;
for (i = 0; i < len; i++) {
if ((rb->write_ptr + 1) % BUFFER_SIZE == rb->read_ptr) {
return i;
}
rb->data[rb->write_ptr] = data[i];
rb->write_ptr = (rb->write_ptr + 1) % BUFFER_SIZE;
}
return i;
}
int rb_read(ring_buffer *rb, char *buf, int len) {
int i;
for (i = 0; i < len; i++) {
if (rb->read_ptr == rb->write_ptr) {
return i;
}
buf[i] = rb->data[rb->read_ptr];
rb->read_ptr = (rb->read_ptr + 1) % BUFFER_SIZE;
}
return i;
}
int main() {
ring_buffer rb;
rb_init(&rb);
char buf[BUFFER_SIZE];
int i, len;
len = rb_write(&rb, "Hello, world!", 13);
printf("Wrote %d bytes\n", len);
len = rb_read(&rb, buf, BUFFER_SIZE);
printf("Read %d bytes: ", len);
for (i = 0; i < len; i++) {
printf("%c", buf[i]);
}
printf("\n");
return 0;
}
```
在这个示例中,我们首先定义了一个包含缓冲区数据和指针的结构体 ring_buffer。rb_init() 函数被用来初始化 ring_buffer 结构体,它分配了一个大小为 BUFFER_SIZE 的缓冲区,并将读和写指针初始化为 0。
接下来,我们定义了两个函数 rb_write() 和 rb_read(),用于写入和读取数据。这两个函数都接受一个指向 ring_buffer 结构体的指针,以及要写入或读取的数据和长度。在 rb_write() 中,我们使用一个循环来逐个写入数据,如果写指针到达缓冲区的末尾,则从缓冲区的开头重新开始写入。如果写入的数据超过了缓冲区的大小,则返回已写入的字节数。
在 rb_read() 中,我们同样使用一个循环来逐个读取数据,如果读指针等于写指针,则返回已读取的字节数。在读取数据时,我们将数据存储到 buf 数组中,并将读指针移动到下一个位置。
在 main() 函数中,我们首先初始化了 ring_buffer,然后调用 rb_write() 函数将字符串 "Hello, world!" 写入缓冲区。接着,我们调用 rb_read() 函数读取缓冲区中的数据,并将其存储到 buf 数组中。最后,我们打印出已读取的数据。
运行该程序,输出如下:
```
Wrote 13 bytes
Read 13 bytes: Hello, world!
```
这表明我们成功地使用 ring buffer 实现了数据的异步传输。