C语言实现循环buff,每次读取数据都是从写指针的位置往前推N个字节开始读取,详细如下描述? 30

如下图所示,一个循环buffer,start是buffer的首地址,假设每10ms往循环buff写M字节个数据(不停的往里写数据,可以覆盖之前的数据,而且M值每次可能不同... 如下图所示,一个循环buffer,start是buffer的首地址,假设每10ms 往循环buff写M字节个数据(不停的往里写数据,可以覆盖之前的数据,而且M值每次可能不同),然后根据写指针的位置--write,往前推N个字节(N<M),开始读取数据,也就是从指针write-N的位置开始读取,读取write-N——write之间的数据,请问怎么实现,谢谢 展开
 我来答
司马刀剑
高粉答主

2020-01-08 · 每个回答都超有意思的
知道顶级答主
回答量:4.6万
采纳率:93%
帮助的人:7289万
展开全部
  • 循环读取一个文件的内容。

    这样做没有任何意义,不如把读取的内容保持在变量当中,节省空间时间。如果非要反复读取的话可以使用rewind函数把文件指针重置。

    函数名: rewind()功 能: 将文件内部的位置指针重新指向一个流(数据流/文件)的开头注意:不是文件指针而是文件内部的位置指针,随着对文件的读写文件的位置指针(指向当前读写字节)向后移动。而文件指针是指向整个文件,如果不重新赋值文件指针不会改变。rewind函数作用等同于 (void)fseek(stream, 0L, SEEK_SET);

  • 循环读取多个文件的内容。

    把多个文件名存在一个字符串数组当中。使用循环语句反复打开-读取-关闭即可。

    例如:


    char * s[3]={"文件一","文件二","文件三"};for(i=0;i<3;i++){    f=fopen(s[i]); //打开第i个文件   //读取数据    fclose(f);//关闭文件}   

追问
不是循环读取一个文件,是数据流往循环buffer不停的写,每个周期可能写入的长度不确定
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cdyzxy
2020-01-10 · TA获得超过2.1万个赞
知道大有可为答主
回答量:1.4万
采纳率:84%
帮助的人:3654万
展开全部
首先,定义buff,假设长度为BUFFLEN
用一个整型变量nWrite记录当前写指针的位置,也就是将要填入数据位置,写指针前面的N个数是要读入的数据,因此定义nRead变量,当nRead变量为负数时,数据无效或者是已经读过了,否则数据可读
#define BUFFLEN 256
#define M 16
#define N 12
unsigned int buff[BUFFLEN];
int nWrite=0,nRead=-1,bRead=0; // bRead=0表示数据不可读,等于1表示可读
//此函数每10ms被调用一次,参数即为要写入的数据
void WriteData(unsigned int *data) { int i,r;
for ( i=0;i<M;i++ ) { buff[nWrite]=data[i]; nWrite++; nWrite%=BUFFLEN; }

r=nWrite; for ( i=0;i<N;i++ ) { r--; if ( r<0 ) r=BUFFLEN-1; }
bRead=0; //数据不可读,要修改nRead的值
nRead=r;

bRead=1; //数据可读
}
//此函数读取数据,不定期调用,返回值为0表示无可用数据,为1表示有数据读回
int ReadData(unsigned int *data) { int r,i;
if ( !bRead ) return 0; else if ( nRead<0 ) return 0; else r=nRead;
for ( i=0;i<N;i++ ) { data[i]=buff[r]; r++; r%=BUFFLEN; }
if ( bread ) if ( r==nWrite ) nRead=-1;
}
追问
bRead=0; //数据不可读,要修改nRead的值
nRead=r;

bRead=1; //数据可读
这个顺序执行吗?
追答
就是在nRead赋值时,将bRead设置成不可读,如果你的ReadData并不是中断程序能打断WriteData函数运行,这个可以省略。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式