memcpy() 实现循环缓冲区数据的读写
使用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() 实现循环缓冲区数据的读写的更多相关文章
- linux c++循环缓冲区模板类
一:概述 实际学习和工作中,我们经常会遇到读写大量数据的情况,这个时候我们可能就用到了循环缓冲区. 循环缓冲区在处理大量数据的时候有很大的优点,循环缓冲区在一些竞争问题上提供了一种免锁的机制,免锁的前 ...
- JAVA基础学习之流的简述及演示案例、用缓冲区方法buffer读写文件、File类对象的使用、Serializable标记接口(6)
1.流的简述及演示案例输入流和输出流相对于内存设备而言.将外设中的数据读取到内存中:输入将内存的数写入到外设中:输出.字符流的由来:其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表. ...
- 高效的两段式循环缓冲区──BipBuffer
Simon Cooke,美国 (原作者) 北京理工大学 20981 陈罡(翻译) 写在前面的话: 循环缓冲区是一个非常常用的数据存储结构,已经被广泛地用于连续.流数据的存储和通信应用中.对于循环缓冲区 ...
- python03-break、continue、for循环、数据bytes类型、字符串与字节的关系、变量指向与深浅拷贝、set集合、文件操作
目录: 1.break.continue 2.for循环 3.数据bytes类型 4.字符串与字节的关系 5.变量指向与深浅拷贝 6.set集合 7.文件操作 一.break.continue bre ...
- scanf函数读取缓冲区数据的问题
标准I\O的缓冲类型 标准I\O根据不同的应用需求,提供了全缓冲.行缓冲.无缓冲三种缓冲方式. 全缓冲:只有当划定的缓冲区被填满或者数据读取至末尾时,才开始执行I\O操作(执行系统提供的read\wr ...
- [典型漏洞分享]一个典型的软件漏洞--memcpy导致的缓冲区溢出
YS VTM模块存在缓冲区溢出漏洞,可导致VTM进程异常退出[高] 问题描述: YS VTM模块开放对外监听端口(8554和8664),并从外部接收网络数据,中间模块调用到memcpy函数对网络数据进 ...
- MYSQL中创建存储过程实现向表中循环插入数据
首先在test数据库中先创建一个表test: CREATE TABLE test( ID INT PRIMARY KEY AUTO_INCREMENT ,test_name VARCHAR(20),t ...
- Linux C 文件与目录4 将缓冲区数据写入磁盘
将缓冲区数据写入磁盘 所谓缓冲区,是Linux系统对文件的一种处理方式.在对文件进行写操作时,并没有立即把数据写入到磁盘,而是把数据写入到缓冲区.如果需要把数据立即写入到磁盘,可以使用sync函数.用 ...
- boost 循环缓冲区
boost 循环缓冲区 #include <boost/circular_buffer.hpp> int _tmain(int argc, _TCHAR* argv[]) { boost: ...
随机推荐
- 记录前端开发vue常见问题,不断更新
1.点击刷新当天组件 1.可以在query中添加一个时间戳,缺点就是不好看 2.加一个重定向页面redirect页面,然后在beforecreate时this.$router.replace原路径 2 ...
- javascript 对象的创建与继承模式
针对JS高级程序设计这本书,主要是理解概念,大部分要点源自书内.写这个主要是当个笔记加总结 存在的问题请大家多多指正! 6.1理解对象 创建对象的两个方法(暂时) //第一种,通过创建一个Object ...
- TinyMCE基础配置
选择器配置 插件配置 工具栏配置 菜单配置 皮肤配置 编辑区宽高配置 编辑区样式配置 隐藏状态栏 选择器配置 选择器就是CSS选择器,它告诉TinyMCE哪个元素是可编辑的. 示例: tinymce. ...
- Object::connect: No such slot QWidget::
出现如下错误 Object::connect: No such slot QWidget::readMyCom() in ../untitled/ConversionScreen.cpp:49 解决办 ...
- itextpdf中表格中单元格的文字水平垂直居中的设置
在使用itextpdf中,版本是5.5.6,使用Doucument方式生成pdf时,设置单元格中字体的对齐方式时,发现一些问题,并逐渐找到了解决方式. 给我的经验就是:看官网的例子才能保证代码的效果, ...
- Python:日常应用汇总
判断路径中是否包含中文 import re def IsContainChinese(path:str) -> bool : cnPatter=re.compile(u'[\u4e00-\u9f ...
- JavaScript模拟call和apply的实现
参考: call和apply的模拟实现 1. call:调用一个对象的一个方法,用另一个对象替换当前对象.例如:B.call(A, args1,args2);即A对象调用B对象的方法. /*call( ...
- PacMan 01——地图的搭建
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- ajax 简单例子
Html 代码: <html> <body> <div id="myDiv"><h3>Let AJAX change this te ...
- Anaconda3(5-1)程序编辑器 自带的spyder
1装好后自带spyder编辑器 2 打开软件 3 每次程序需要制定anaconda3中创建的虚拟环境对应 的python版本的路径 例如在我的电脑我创建了两个环境 而我的pytorch安装在pytho ...