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

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

下面是 memcpy() 函数的声明

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

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

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

具体实现代码如下

 #include <fstream>
#include <cstring>
#include "stdio.h"
#include "stdlib.h"
using namespace std; #define DATA_RECV_BUFF_LEN 13 //缓冲区大小
#define DATA_SAVE_BUFF_LEN 2000 //保存区大小
int recv_buff_write = ; //缓冲区写指针
int mark = -; //缓冲区数据溢出 /* buf-->recv 把数据放入循环缓冲区*/
void recvbuf(char* buf, char* save_recv, int len)
{
//数据为空则返回不做缓存
if (NULL == buf) return; /* data-->buf */
//判断缓存区是否还有足够的空间
if (len < (DATA_RECV_BUFF_LEN - recv_buff_write))
{ memcpy(&save_recv[recv_buff_write], buf, len);
recv_buff_write += len; }
else
{
memcpy(&save_recv[recv_buff_write], buf, (DATA_RECV_BUFF_LEN - recv_buff_write ));
memcpy(&save_recv[], &buf[(DATA_RECV_BUFF_LEN - recv_buff_write )], (len - (DATA_RECV_BUFF_LEN - recv_buff_write )));
//写指针重新计数
recv_buff_write = (len - (DATA_RECV_BUFF_LEN - recv_buff_write));
mark = ;
}
} //读取保存区数据数据
void getrecv(char* recv_buff)
{
char data_buff[DATA_SAVE_BUFF_LEN] = { }; //数据读取
/* buf-->data */
//清空数组
memset(data_buff, , DATA_SAVE_BUFF_LEN);
if (recv_buff_write >= and mark == -)
{
memcpy(data_buff, &recv_buff[], recv_buff_write);
}
else
{ memcpy(&data_buff[], &recv_buff[recv_buff_write], DATA_RECV_BUFF_LEN - recv_buff_write );
memcpy(&data_buff[DATA_RECV_BUFF_LEN - recv_buff_write ], &recv_buff[], recv_buff_write );
}
printf("%s\n", data_buff);
} int main()
{
char st1[] ="abcd";
char st2[] = "abcd";
char st3[] = "abcd";
char st4[] = "efgh";
char recv_buff[DATA_RECV_BUFF_LEN] = { }; //缓冲区
recvbuf(st1, recv_buff, strlen(st1));
printf("%d\n", recv_buff_write);
printf("%s\n", recv_buff);
recvbuf(st2, recv_buff, strlen(st2));
printf("%d\n", recv_buff_write);
printf("%s\n", recv_buff);
recvbuf(st3, recv_buff, strlen(st3));
printf("%d\n", recv_buff_write);
printf("%s\n", recv_buff);
recvbuf(st4, recv_buff, strlen(st4));
printf("%d\n", recv_buff_write);
printf("%s\n", recv_buff);
printf("读取缓冲区的数据:\n");
getrecv(recv_buff);
printf("mark is %d\n", mark);
return ;
}

运行结果如下

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

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. VMware + CentOS 7搭建环境(二)

    1.环境要求建议使用VMwareWorkstation虚拟机软件:可以使用快照功能,保存虚拟机状态:本文档示例版本10.0.1:1.2 CentOS系统的iso文件; 下载好的.iso的压缩文件格式, ...

  2. python3 内建函数filter

    Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是 ...

  3. sql的日期格式化转化

    1. DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据. DATE_FORMAT(date,format) 可以使用的格式有: 格式 描述 %a 缩写星期名 %b 缩写月名 %c 月 ...

  4. 跟着9张思维导图学习Javascript js 关键字和保留字 css3中的BFC,IFC,GFC和FFC

    跟着9张思维导图学习Javascript   学习的道路就是要不断的总结归纳,好记性不如烂笔头,so,下面将 po 出我收集的 9 张 javascript 相关的思维导图(非原创). 思维导图小ti ...

  5. PHP:CURL分别以GET、POST方式请求HTTPS协议接口api【转】

    1.curl以GET方式请求https协议接口 //注意:这里的$url已经包含参数了,不带参数你自己处理哦GET很简单 function curl_get_https($url){ $curl = ...

  6. Django rest framework ---- 权限

    Django rest framework ---- 权限 添加权限 api/utils文件夹下新建premission.py文件,代码如下: message是当没有权限时,提示的信息 # FileN ...

  7. Shell 编程 文本处理工具 sed

    本篇主要写一些shell脚本文本处理工具sed的使用. 概述 sed(Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除.替换.添加 ...

  8. VS2013 EF6连接MySQL步骤

    1.安装MySql的VS插件(版本请下载最新版)mysql-for-visualstudio-1.2.3.msihttp://cdn.mysql.com/Downloads/MySQL-for-Vis ...

  9. C#进程间通讯或同步的框架引荐

    这篇文章主要介绍了一个进程间通讯同步的C#框架,代码具有相当的稳定性和可维护性,随着.NET的开源也会被注入更多活力,推荐!需要的朋友可以参考下  0.背景简介 微软在 .NET 框架中提供了多种实用 ...

  10. 【AICC】2019训练营笔记

    1.AI 人工的方法在机器上实现智能:机器学习.计算机视觉.规划决策.自然语言处理.认知推理.高效搜索 2.三大学派 符号主义 连接主义:CNN 行为主义 3.两条路线 结构模仿 功能模仿 4.AI芯 ...