fwrite写固定大小长度,超过之后返回文件开头重新写;怎么实现啊,
log_fd = fopen("xxxx.log", "ab+");
if (log_fd != NULL)
{
rval = stat("dsp.log", &statbuf);
if (rval == -1) {
perror("stat failed");
}
else
{
printf("file size = %lld\n", (long long)statbuf.st_size);
}
if((long long)statbuf.st_size > 1024)
{
}
fseek(log_fd, 0, SEEK_END);
len = ftell(log_fd);
if(len > 1024*10)
{
printf("file is big 1024*10\n");
rewind(log_fd);
}
printf("file len: %d cur %d \n", len, cur);
fwrite(sz_degmsg, msglen,1, log_fd);
fclose(log_fd);
加入现在文件大小超过1M,我让他从头循环覆盖写,这样怎么实现不了那?
你要在另外一个地方记住当前文件写到哪里了。
因为一旦文件写到1024 X 10这个长度后,你这一次从头写了一段数据,这个长度没有保存的。你下次再来写,第17行返回的值还是1024 X 10,所以你又从头开始写了。
最终你每次都是覆盖前面那一点数据
不知道你的运行环境和整个软件架构不好改啊。如果运行都会退出你的软件,那你必须把数据保存在外部存储介质上,调用这个函数的时候再读回来,也就是说你要用另一个文件保存你这个文件写到哪里了。如果你的软件不会退出,你用个全局变量或者静态局变量保存就行了。
下在我以你的软件不会退出的情况示例一下,用静态局变量保存写文件的位置。
static unsigned int position = 0;
log_fd = fopen("xxxx.log", "ab+");
if (log_fd != NULL)
{
if((position + msglen) > 102410)
{
printf("file is big 102410\n");
position = 0;
}
fseek(log_fd, position, SEEK_SET);
fwrite(sz_degmsg, msglen,1, log_fd);
position += msglen;
fclose(log_fd);
```c
log_fd = fopen("dsp.log", "ab+");
if (log_fd != NULL)
{
if((position + msglen) > 29840)
{
printf("file is big 102410\n");
position = 0;
}
fseek(log_fd, position, SEEK_SET);
fwrite(sz_degmsg, msglen,1, log_fd);
position += msglen;
fclose(log_fd);
}
```
刚试了下,好像还是不行的,很奇怪;