欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

memcpy() 实现循环缓冲区数据的读写

程序员文章站 2023-08-23 00:00:52
在做伪终端的时候需要处理数据溢出的问题,目前采取了这个策略,特地分享了下,希望大家可以一起成长 ......

使用memcpy()函数做循环缓冲区的读写

首先对mencpy函数做个简单的介绍

下面是 memcpy() 函数的声明

  void *memcpy(void *str1, const void *str2, size_t n)
  参数
      str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
      str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。
      n -- 要被复制的字节数。
  该函数返回一个指向目标存储区 str1 的指针。

/*******************************
mencpy的常见用法有如下:
1. 复制字符串
2. 复制字符串中从某个位置开始的某些子连续字符串
3. 覆盖字符串的原有内容
******/

 

好了长话短说, 直接进入主题

memcpy() 实现循环缓冲区数据的读写

 

 

具体实现代码如下

 

 1 #include <fstream>
 2 #include <cstring>
 3 #include "stdio.h"    
 4 #include "stdlib.h"   
 5 using namespace std;
 6 
 7 
 8 #define data_recv_buff_len             13                   //缓冲区大小
 9 #define data_save_buff_len             2000                   //保存区大小
10 int recv_buff_write = 0;                //缓冲区写指针
11 int mark = -1;                          //缓冲区数据溢出
12 
13 
14 
15 
16 
17 /* buf-->recv 把数据放入循环缓冲区*/
18 void recvbuf(char* buf, char* save_recv, int len)
19 {
20     //数据为空则返回不做缓存
21     if (null == buf) return;
22 
23     /* data-->buf */
24     //判断缓存区是否还有足够的空间
25     if (len < (data_recv_buff_len - recv_buff_write))
26     {
27         
28             memcpy(&save_recv[recv_buff_write], buf, len);
29             recv_buff_write += len;
30         
31 
32     }
33     else
34     {    
35             memcpy(&save_recv[recv_buff_write], buf, (data_recv_buff_len - recv_buff_write ));
36             memcpy(&save_recv[0], &buf[(data_recv_buff_len - recv_buff_write )], (len - (data_recv_buff_len - recv_buff_write )));
37             //写指针重新计数
38             recv_buff_write = (len - (data_recv_buff_len - recv_buff_write));
39             mark = 1;
40     }
41 }
42 
43 //读取保存区数据数据
44 void getrecv(char* recv_buff)
45 {
46     char data_buff[data_save_buff_len] = { 0 };    //数据读取
47     /* buf-->data */
48     //清空数组
49     memset(data_buff, 0, data_save_buff_len);
50     if (recv_buff_write >=0 and mark == -1)
51     {
52         memcpy(data_buff, &recv_buff[0], recv_buff_write);
53     }
54     else
55     {
56         
57         memcpy(&data_buff[0], &recv_buff[recv_buff_write], data_recv_buff_len - recv_buff_write );
58         memcpy(&data_buff[data_recv_buff_len - recv_buff_write ], &recv_buff[0], recv_buff_write );
59     }
60     printf("%s\n", data_buff);
61 }
62 
63 int main()
64 {
65     char st1[10] ="abcd";
66     char st2[10] = "abcd";
67     char st3[10] = "abcd";
68     char st4[10] = "efgh";
69     char recv_buff[data_recv_buff_len] = { 0 };    //缓冲区
70     recvbuf(st1, recv_buff, strlen(st1));
71     printf("%d\n", recv_buff_write);
72     printf("%s\n", recv_buff);
73     recvbuf(st2, recv_buff, strlen(st2));
74     printf("%d\n", recv_buff_write);
75     printf("%s\n", recv_buff);
76     recvbuf(st3, recv_buff, strlen(st3));
77     printf("%d\n", recv_buff_write);
78     printf("%s\n", recv_buff);
79     recvbuf(st4, recv_buff, strlen(st4));
80     printf("%d\n", recv_buff_write);
81     printf("%s\n", recv_buff);
82     printf("读取缓冲区的数据:\n");
83     getrecv(recv_buff);
84     printf("mark is %d\n", mark);
85     return 0;
86 }

 

运行结果如下

 

memcpy() 实现循环缓冲区数据的读写

 

 

 

好了,本次分享到此结束,不喜勿喷