文件中有一个位置指针,指向当前读写的位置。如果顺序读写一个文件,每次读写一个字符,则读写完一个字符后,该位置指针自动移动指向下一个字符位置。如果想改变这样的规律,即强制使位置指针指向其他指定的位置,这可以用有关函数来实现。
1.rewind函数
rewind函数的作用是使位置指针重新返回文件的开头。此函数没有返回值,执行rewind函数
rewind (fp);
使文件的位置指针重新定位于文件开头,并使feof函数的值恢复为0(假)。
2.fseek函数和随机读写
对流式文件可以进行顺序读写,也可以进行随机读写。用fseek函数可以实现改变文件的位置指针。函数的调用形式为
fseek(文件类型指针,位移量,起始点)
“起始点”用0,1或2代替,0代表“文件开始”,1代表“当前位置”,2代表“文件末尾”。也可以使用符号定义,即SEEK_SET代表“文件开始”,SEEK_CUR代表“当前位置”,SEEK_END代表“文件末尾”。下面是几个例子:
fseek(fp,100L,0); //把文件内部指针移动到离文件开头100字节处;fseek(fp,100L,1); //把文件内部指针移动到离文件当前位置100字节处;fseek(fp,-100L,2); //把文件内部指针退回到离文件结尾100字节处。
3.ftell函数
ftell函数的作用是得到流式文件中的当前位置,并将它用相对于文件开头的位移量表示出来。假设n为整型变量,则
n=ftell(fp);
将获取的fp指定文件的当前读写位置传给变量n,n是当前读写位置偏离文件头部的字节数。
用fseek函数把位置指针移到文件尾,再用ftell函数获得这时位置指针距文件头的字节偏移数,这个字节数+1就是文件的长度。
【例22.22】演示3个文件定位函数的程序。
#include <stdio.h>int main(){ char str[128]="How are you? Fine! thank you."; char st[128]={'/0'}; int length=0; FILE *fp; fp=fopen ("t.txt","w+"); fputs(str, fp); //把文件的位置指针移到离文件头4字节处 fseek(fp,4L,SEEK_SET); fgets(st,4,fp); //取are printf("%s/n", st); //把文件的位置指针移到离当前文件指针6字节处 fseek(fp,6L,SEEK_CUR); fgets(st,7,fp); //取Fine! printf("%s/n", st); if(fp==NULL) printf("file not found!/n"); else { //把文件的位置指针移到文件尾 fseek(fp,0L,SEEK_END); //获取文件长度; length=ftell(fp)+1; printf("该文件的长度为%d字节/n",length); } //把文件的位置指针移到离文件尾16字节处 fseek(fp,-16L,SEEK_END); fgets(st,17,fp); //取Fine! thank you. printf("%s/n", st); rewind(fp); //回起始点 fgets(st,30,fp); //取整个字串 printf("%s/n", st); fclose(fp); return 0;}
对照程序,很容易理解这3个函数的使用方法。程序运行结果如下:
areFine!该文件的长度为30字节Fine! thank you.How are you? Fine! thank you.