1、int型环形缓冲区
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int head = 0, tail = 0;
char rb[128] = {0};
int push_data(char *ring_buffer, int data)
{
ring_buffer[tail] = data;
tail++;
if ((tail % 16) == 0)
tail = 0;
if (tail == head)
head++;
if ((head % 16) == 0)
head = 0;
return 0;
}
int show_ring_buffer(char *ring_buffer)
{
int i = 0;
for (i = 0; i < 16; i++) {
printf("%02d ", rb[i]);
}
printf("\n");
for (i = 0; i < 16; i++) {
if (i == tail) {
printf("|| ");
continue;
}
printf("%02c ", ' ');
}
printf("\n");
for (i = 0; i < 16; i++) {
if (i == head) {
printf("^^ ");
continue;
}
printf("%02c ", ' ');
}
printf("\n");
return 0;
}
int show_ring_buffer_from_head(char *buf)
{
int i = 0;
for (i = head; i != tail; i++) {
printf("%02d ", rb[i]);
if (i == 15)
i = -1;
}
printf("\n");
return 0;
}
int main(void)
{
int ret;
int data = 1;
while (1) {
push_data(rb, data);
data++;
show_ring_buffer(rb);
//show_ring_buffer_from_head(rb);
sleep(1);
}
return 0;
}
2、字符串环形缓冲区
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int head = 0, tail = 0;
char rb[16][1024] = {0};
int push_data(char ring_buffer[16][1024], const char *data_str)
{
strcpy(ring_buffer[tail], data_str);
tail++;
if ((tail % 16) == 0)
tail = 0;
if (tail == head)
head++;
if ((head % 16) == 0)
head = 0;
return 0;
}
int show_ring_buffer(char ring_buffer[16][1024])
{
int i = 0;
for (i = 0; i < 16; i++) {
printf("%02s ", rb[i]);
}
printf("\n");
for (i = 0; i < 16; i++) {
if (i == tail) {
printf("|| ");
continue;
}
printf("%02c ", ' ');
}
printf("\n");
for (i = 0; i < 16; i++) {
if (i == head) {
printf("^^ ");
continue;
}
printf("%02c ", ' ');
}
printf("\n");
return 0;
}
int show_ring_buffer_from_head(char *buf)
{
int i = 0;
for (i = head; i != tail; i++) {
printf("%02d ", rb[i]);
if (i == 15)
i = -1;
}
printf("\n");
return 0;
}
char data_str[1024];
int main(void)
{
int ret;
int data_index = 0;
while (1) {
memset(data_str, 0, sizeof(data_str));
sprintf(data_str, "iosdjfoisdf: %d", data_index);
//printf("%s\n", data_str);
push_data(rb, data_str);
data_index++;
show_ring_buffer(rb);
//show_ring_buffer_from_head(rb);
sleep(1);
}
return 0;
}