关于fseek和文件"ab+"打开方式的问题

时间:2022-11-26 20:05:24

这是在写一个文件的的时候发生的一个错误,代码如下

 #include<stdio.h>
#include <errno.h>
#include <string.h> int main(){
FILE * fp; char t = ;
for (int i = ; i <= ; i++)
{
fp = fopen("test.txt" , "ab");  
t = i;
if ( == i)
continue; if (fseek(fp, (i - ) * , SEEK_SET))
printf("i = %d errno = %d(%s)",i, errno, strerror(errno));
printf("当前位置:%d ", ftell(fp) / );
printf("文件结束符%d\n", feof(fp));
for (int j = ; j < ; j++)
fwrite(&t, , , fp);
fclose(fp);
}
fp = fopen("test.txt", "ab");
t = ;
fseek(fp, ( - ) * , SEEK_SET);
printf("当前位置:%d ", ftell(fp) / );
printf("文件结束符%d\n", feof(fp));
for (int j = ; j < ; j++)
fwrite(&t, , , fp);
fclose(fp); return ;
}

按照常理来说,这样的写入文件会按照顺序写入100个1024的字符,但是结果是在写到55号块(对应ASCI字符37)时并没有写入而是直接写入56号块(38) ,37是写在文件的最后的。

打印出来的ftell和feof()的信息是这样的

...
当前位置: 文件结束符0
当前位置: 文件结束符0
当前位置: 文件结束符0
当前位置: 文件结束符0
当前位置: 文件结束符0
当前位置: 文件结束符0
当前位置: 文件结束符0
当前位置: 文件结束符0
...
当前位置: 文件结束符0
当前位置: 文件结束符0
当前位置: 文件结束符0
当前位置: 文件结束符0
当前位置: 文件结束符0
当前位置: 文件结束符0

也就是说每次fseek其实是改变了文件指针,但是feof()却始终为0;原因如下;

 fseek每次其实都改变了文件指针,打印出来是对的(ftell),但是feof()却每次都是0 ,因为ab+的意思是可以读文件的所有位置但却只能在文件的末尾写入。也就是说,之前的fseek对于以a模式打开的文件来说,对读取有效,对写入是没有作用的。