关于fseek和文件"ab+"打开方式的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于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模式打开的文件来说,对读取有效,对写入是没有作用的。
以上是关于关于fseek和文件"ab+"打开方式的问题的主要内容,如果未能解决你的问题,请参考以下文章
请问C语言对文件的读取都有哪些函数,都有啥功能?像fseek();fscanf();fread......啥的