关于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模式打开的文件来说,对读取有效,对写入是没有作用的。 

 

转载于:https://www.cnblogs.com/928pjy/p/5548245.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值