使用文件流时,文件中有一个指针标志文件当前的读写位置。读写一个字符后,文件的位置指针会向后移动到下一个字符的位置。有时候,程序需要从文件的不同位置“跳跃”地读取字符,这时就要用到相关的函数。

文件指针,即指向文件的指针。关于利用文件指针进行文件读写可以看我上篇博客:

 

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 }

运行结果:

JFileChooser定位到当前文件夹_文件指针

可见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 }

运行结果:

JFileChooser定位到当前文件夹_文件指针_02

可以看出,输出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()函数将位置指针重置到开头了。

 

同样地,这几个函数也可以嵌入到循环语句中,因为其运用时要注意的细节较多,使用时一定要小心谨慎。