纯C小练习之模拟循环缓冲区

来源:互联网 发布:票务平台知乎 编辑:程序博客网 时间:2024/05/16 05:37

     为了巩固一下C语言基础,写了几个小程序。下面这个小程序实现了一个循环缓冲区,击键盘的“I”键,一个键盘事件被写入缓冲区;敲击“O”键,代表一个键盘事件从缓冲区被读出。以下是代码:

#include <stdio.h>
#include <stdlib.h>

#define BUTTOM_BUFF_SIZE 8
#define KEY_EVENT   'e'

typedef unsigned char u8;

typedef struct{
u8 buff[BUTTOM_BUFF_SIZE];
u8 head,tail;
}buttom_dev_t;

static buttom_dev_t btm_dev;

static void event_in_buff()
{
     btm_dev.buff[btm_dev.head]= KEY_EVENT;   //数据写进循环缓存区   %BUTTOM_BUFF_SIZE
     btm_dev.head = (++btm_dev.head)%BUTTOM_BUFF_SIZE;        
     if(btm_dev.head == btm_dev.tail){
         btm_dev.tail = (++btm_dev.tail)%BUTTOM_BUFF_SIZE;
     }
}

static u8 event_out_buff()
{
     u8 ret;

     if(btm_dev.head==btm_dev.tail){
         return 0;
     }
     ret = btm_dev.buff[btm_dev.tail];
     btm_dev.buff[btm_dev.tail++]=' '; //模拟数据被取走,打印出来为空!
     if(btm_dev.tail == BUTTOM_BUFF_SIZE){
         btm_dev.tail &= BUTTOM_BUFF_SIZE-1;
     }
     return ret;
}

void show()
{
     int i;
     int n;
     char flag;
     int head=(int)btm_dev.head;
     int tail=(int)btm_dev.tail;

//line 1 打印缓冲区数据
     for(i=0;i<BUTTOM_BUFF_SIZE;i++){
         printf(" %c ",(char)btm_dev.buff[i]);
     }
     printf("/n");

//line 2 打印读写指针的位置
     if(tail>head){
         for(i=0;i<head;i++) //space before 'w'
             printf("    ");
         printf(" w ");

         for(i=0;i<tail-head-1;i++)
             printf("    ");
         printf(" r ");
     }
     else if(tail<head){
         for(i=0;i<tail;i++) //space
             printf("    ");
         printf(" r ");

         for(i=0;i<head-tail-1;i++)
             printf("    ");
         printf(" w ");
     }
     else{
         for(i=0;i<head;i++)
             printf("    ");
         printf(" b ");
     }

     // 打印head,tail的数值
     printf("/n");
     printf("h=%d/tt=%d/n",btm_dev.head,btm_dev.tail);
}


int main()
{
     int i;
     char c;

     btm_dev.head = btm_dev.tail = 0;

     printf("****************************************************/n");
     printf("*                                                   */n");
     printf("*        Hit Key I     --- An event IN buff           */n");
     printf("*        Hit Key O     --- An event OUT buff          */n");
     printf("*        Hit Key Q     --- Quit                       */n");
     printf("*        Any Key Else --- No event                   */n");
     printf("*                                                   */n");
     printf("****************************************************/n");

     while(1){
         c = getch();
         if(c=='i'){
             printf("/n===================An event IN buff!================/n");
             event_in_buff();
             show();
         }
         else if (c=='o'){
             printf("/n===================An event OUT buff!===============/n");
             event_out_buff();
             show();
         }
         else if(c=='q'){
      printf("/n*** exit ***/n");
      break;
}
else
             printf("/n=======================No event!====================/n");
     }

     exit(0);
}


运行结果: