文件流之文件的定位
使用文件流时,文件中有一个指针标志文件当前的读写位置。读写一个字符后,文件的位置指针会向后移动到下一个字符的位置。有时候,程序需要从文件的不同位置“跳跃”地读取字符,这时就要用到相关的函数。
文件指针,即指向文件的指针。关于利用文件指针进行文件读写可以看我上篇博客:https://www.cnblogs.com/kaml8/p/9786364.html
1.rewind()函数
格式:rewind(文件指针)
如:rewind(fp)
功能:将文件的位置指针重新定义在文件的开头。
示例代码:
1 #include <stdio.h> 2 int main() 3 { 4 FILE *fin,*fout;//定义文件指针 5 int i; 6 float t; 7 fin=fopen("in.txt","r"); 8 fout=fopen("out.txt","w"); 9 fscanf(fin,"%d %f",&i,&t); 10 fprintf(fout,"%d %6.2f",i,t); 11 rewind(fin);//将fin指向文件的位置指针重置到开头 12 fscanf(fin,"%d %f",&i,&t);//第二次进行读取 13 fprintf(fout,"%d %6.2f",i,t);//第二次进行输出 14 fclose(fin);//关闭输入文件 15 fclose(fout);//关闭输出文件 16 17 return 0; 18 }
运行结果:
可见i和t的值被两次写入到out.txt中。
2.fseek()函数
格式:fseek(文件指针,位移量,起始点)
如:fseek(fp,4L,1) //将fp指向文件的位置指针从当前位置向前移动4个字节
功能:按一定规则改变文件的位置指针。
说明: a)位移量表示从起始点向前移动的字节数,一般要求是long型,如100L。
b)起始点取值{0,1,2},0表示文件开头,1表示当前位置,2表示文件末尾;起始点为2时的位移量一般为负数,表示向后移动。
c)C环境下,一般int型和float型为4字节,char型为1字节,double型为8字节。
示例代码:
1 #include <stdio.h> 2 int main() 3 { 4 FILE *fin,*fout;//定义文件指针 5 int i; 6 float t; 7 fin=fopen("in.txt","r"); 8 fout=fopen("out.txt","w"); 9 fscanf(fin,"%d %f",&i,&t); 10 fprintf(fout,"%d %6.2f",i,t); 11 fseek(fin,4L,1);//将fin指向文件的位置指针从当前位置向前移动4个字节 12 fscanf(fin,"%d %f",&i,&t);//第二次进行读取 13 fprintf(fout,"%d %6.2f",i,t);//第二次进行输出 14 fclose(fin);//关闭输入文件 15 fclose(fout);//关闭输出文件 16 17 return 0; 18 }
运行结果:
可以看出,输出363和73.58后,位置指针从当前位置73.58向前4个字节,即向前一个整型或浮点型长度,再次读写,将8和356.12写入到out.txt中。
3.feof函数
格式:feof(文件指针)
如:feof(fp) //判断fp指向的文件的位置指针是否到达文件末尾
功能:判断位置指针是否到达文件末尾,是则返回真(非0),否则为假(0)。
示例:
rewind(fp);
fprintf(feof(fp));
输出值为0,因为rewind()函数将位置指针重置到开头了。
同样地,这几个函数也可以嵌入到循环语句中,因为其运用时要注意的细节较多,使用时一定要小心谨慎。