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

运行结果如下

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

memcpy() 实现循环缓冲区数据的读写的更多相关文章

  1. linux c++循环缓冲区模板类

    一:概述 实际学习和工作中,我们经常会遇到读写大量数据的情况,这个时候我们可能就用到了循环缓冲区. 循环缓冲区在处理大量数据的时候有很大的优点,循环缓冲区在一些竞争问题上提供了一种免锁的机制,免锁的前 ...

  2. JAVA基础学习之流的简述及演示案例、用缓冲区方法buffer读写文件、File类对象的使用、Serializable标记接口(6)

    1.流的简述及演示案例输入流和输出流相对于内存设备而言.将外设中的数据读取到内存中:输入将内存的数写入到外设中:输出.字符流的由来:其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表. ...

  3. 高效的两段式循环缓冲区──BipBuffer

    Simon Cooke,美国 (原作者) 北京理工大学 20981 陈罡(翻译) 写在前面的话: 循环缓冲区是一个非常常用的数据存储结构,已经被广泛地用于连续.流数据的存储和通信应用中.对于循环缓冲区 ...

  4. python03-break、continue、for循环、数据bytes类型、字符串与字节的关系、变量指向与深浅拷贝、set集合、文件操作

    目录: 1.break.continue 2.for循环 3.数据bytes类型 4.字符串与字节的关系 5.变量指向与深浅拷贝 6.set集合 7.文件操作 一.break.continue bre ...

  5. scanf函数读取缓冲区数据的问题

    标准I\O的缓冲类型 标准I\O根据不同的应用需求,提供了全缓冲.行缓冲.无缓冲三种缓冲方式. 全缓冲:只有当划定的缓冲区被填满或者数据读取至末尾时,才开始执行I\O操作(执行系统提供的read\wr ...

  6. [典型漏洞分享]一个典型的软件漏洞--memcpy导致的缓冲区溢出

    YS VTM模块存在缓冲区溢出漏洞,可导致VTM进程异常退出[高] 问题描述: YS VTM模块开放对外监听端口(8554和8664),并从外部接收网络数据,中间模块调用到memcpy函数对网络数据进 ...

  7. MYSQL中创建存储过程实现向表中循环插入数据

    首先在test数据库中先创建一个表test: CREATE TABLE test( ID INT PRIMARY KEY AUTO_INCREMENT ,test_name VARCHAR(20),t ...

  8. Linux C 文件与目录4 将缓冲区数据写入磁盘

    将缓冲区数据写入磁盘 所谓缓冲区,是Linux系统对文件的一种处理方式.在对文件进行写操作时,并没有立即把数据写入到磁盘,而是把数据写入到缓冲区.如果需要把数据立即写入到磁盘,可以使用sync函数.用 ...

  9. boost 循环缓冲区

    boost 循环缓冲区 #include <boost/circular_buffer.hpp> int _tmain(int argc, _TCHAR* argv[]) { boost: ...

随机推荐

  1. Eclipse调用Tomcat出错

    错误提示:The server cannot be started because one or more of the ports are invalid. Open the server edit ...

  2. 数据结构 - 二叉搜索树封装 C++

    二叉搜索树封装代码 #pragma once #include <iostream> using namespace std; template<class T>class T ...

  3. 朱石景 201671010457 团队项目评审&课程学习总结

    项目 内容 这个作业属于哪个课程 http://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/ ...

  4. String s = new String("xyz");创建了几个String Object?并作说明。

    String s = new String("xyz");创建了几个String Object?并作说明. 共产生了两个2个对象,第一个是字符串常量xyz,存储于常量池中.第二个对 ...

  5. Free Professional Resume Examples and Writing Tips

    https://www.thebalancecareers.com/free-resume-examples-and-writing-tips-2063596 Do you need to write ...

  6. MacOS更改启动台(launchpad)图标大小

    原文链接:https://www.jianshu.com/p/18224d191bd2作者:麦壳君 小麦有点强迫症,觉得 Mac 启动台(Launchpad)里面系统默认的应用程序图标太大,所以想让它 ...

  7. Python面向对象 | 类方法 classmethod

      类方法:必须通过类的调用,而且此方法的意义:就是对类里面的变量或者方法进行修改添加. 例一个商店,店庆全场八折,代码怎么写呢? class Goods: __discount = 0.8 # 折扣 ...

  8. Pandas | 11 字符串函数

    在本章中,我们将使用基本系列/索引来讨论字符串操作.在随后的章节中,将学习如何将这些字符串函数应用于数据帧(DataFrame). Pandas提供了一组字符串函数,可以方便地对字符串数据进行操作. ...

  9. vue+ typescript 使用parcel 构建

    parcel 是一个零配置的前端构建工具,相比webpack 更快,同时使用简单以下是 一个简单的使用typescript 开发vue 应用,同时使用parcel 构建,同时集成了docker 构建, ...

  10. I/O管理杂记

    这是一篇杂记,记录了操作系统层面与I/O管理的零散知识点,用于温习使用.由于I/O管理是一个很大的范畴,后续会不断按照自己的生产需求来补充用的到的知识点.计算机系统是人造系统,没有绝对的对错(相对于自 ...