首页 » C语言解惑 » C语言解惑全文在线阅读

《C语言解惑》22.4 文件的定位

关灯直达底部

文件中有一个位置指针,指向当前读写的位置。如果顺序读写一个文件,每次读写一个字符,则读写完一个字符后,该位置指针自动移动指向下一个字符位置。如果想改变这样的规律,即强制使位置指针指向其他指定的位置,这可以用有关函数来实现。

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.