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之间的数据,请问怎么实现,谢谢
展开
2个回答
展开全部
循环读取一个文件的内容。
这样做没有任何意义,不如把读取的内容保持在变量当中,节省空间时间。如果非要反复读取的话可以使用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不停的写,每个周期可能写入的长度不确定
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先,定义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;
}
用一个整型变量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函数运行,这个可以省略。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询