映月读书网 > C语言解惑 > 22.4 文件的定位 >

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个函数的使用方法。程序运行结果如下:


are
Fine
!
该文件的长度为30
字节
Fine
! thank you.
How are you
? Fine
! thank you.