设为首页 加入收藏

TOP

memcpy() 实现循环缓冲区数据的读写
2019-09-30 16:41:41 】 浏览:65
Tags:memcpy 实现 循环 缓冲区 数据 读写

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

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

下面是 memcpy() 函数的声明

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

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

 

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

 

 

具体实现代码如下

 

 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 }

 

运行结果如下

 

 

 

 

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

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇零基础怎样学习好C/C++语言? 下一篇异或运算符的使用

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目