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

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

 1 #include<stdio.h>
 2 #include <errno.h>
 3 #include <string.h>
 4 
 5 int main(){
 6     FILE * fp;
 7 
 8     char t = 1;
 9     for (int i = 1; i <= 100; i++)
10     {
11         fp = fopen("test.txt" , "ab");  
12         t = i;
13         if (55 == i)
14             continue;
15 
16         if (fseek(fp, (i - 1) * 1024, SEEK_SET))
17             printf("i = %d errno = %d(%s)",i, errno, strerror(errno));
18         printf("当前位置:%d    ", ftell(fp) / 1024);
19         printf("文件结束符%d\n", feof(fp));
20         for (int j = 0; j < 1024; j++)
21             fwrite(&t, 1, 1, fp);
22         fclose(fp);
23     }
24     fp = fopen("test.txt", "ab");
25     t = 55;
26     fseek(fp, (55 - 1) * 1024, SEEK_SET);
27     printf("当前位置:%d    ", ftell(fp) / 1024);
28     printf("文件结束符%d\n", feof(fp));
29     for (int j = 0; j < 1024; j++)
30         fwrite(&t, 1, 1, fp);
31     fclose(fp);
32 
33     return 0;
34 }

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

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

...
当前位置:33    文件结束符0
当前位置:34    文件结束符0
当前位置:35    文件结束符0
当前位置:36    文件结束符0
当前位置:37    文件结束符0
当前位置:38    文件结束符0
当前位置:39    文件结束符0
当前位置:40    文件结束符0
...
当前位置:95    文件结束符0
当前位置:96    文件结束符0
当前位置:97    文件结束符0
当前位置:98    文件结束符0
当前位置:99    文件结束符0
当前位置:54    文件结束符0

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

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

 

posted @ 2016-06-01 01:09  928pjy  阅读(1764)  评论(0编辑  收藏  举报