文件中有一个位置指针,指向当前读写的位置。如果顺序读写一个文件,每次读写一个字符,则读写完一个字符后,该位置指针自动移动指向下一个字符位置。如果想改变这样的规律,即强制使位置指针指向其他指定的位置,这可以用有关函数来实现。
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个函数的使用方法。程序运行结果如下:
are Fine ! 该文件的长度为30 字节 Fine ! thank you. How are you ? Fine ! thank you.