文件定位函数
在介绍文件定位函数之前,我们先引入一个“文件位置指针”的概念。“文件位置指针”和前面的“文件指针”完全是两个不同的概念。
文件指针是指在程序中定义的FILE类型的变量,通过fopen函数调用给文件指针赋值,使文件指针和某个文件建立联系,C程序中通过文件指针实现对文件的各种操作。
文件位置指针只是一个形象化的概念,我们将用文件位置指针来表示当前读或写的数据在文件中的位置。当通过fopen函数打开文件时,可以认为文件位置指针总是指向文件的开头、第一个数据之前。当文件位置指针指向文件末尾时,表示文件结束。当进行读操作时,总是从文件位置指针所指位置开始,去读其后的数据,然后位置指针移到尚未读的数据之前,以备指示下一次的读(或写)操作。当进行写操作时,总是从文件位置指针所指位置开始去写,然后移到刚写如的数据之后,以备指示下一次输出的起始位置。
fseek函数
fseek函数用来移动文件位置指针到指定的位置上,接着的读或写操作将从此位置开始。函数的调用形式如下:
fseek(pf,offset,origin);
此处,pf是文件指针;offset是以字节为单位的位移量,为长整型数;origin是起始点,用以指定位移量是以哪个位置为基准,起始点既可用标识符来表示,也可用数字来表示。下表给出了代表起始点的标识符和对应的数字。
标识符 | 数字 | 代表的起始点 |
---|---|---|
SEEK_SET | 0 | 文件开始 |
SEEK_END | 2 | 文件末尾 |
SEEK_CUR | 1 | 文件当前位置 |
对于二进制文件,当位移量为正整数时,表示位置指针从指定的起始点向文件尾部方向移动;当位移量为负整数时,表示位置指针从指定的起始点向文件首部方向移动。
假设pf已指向一个二进制文件,以下函数调用将使文件位置指针从文件的开头后移30个字节:
fseek(pf,30L,SEEK_SET);
若pf已指向一个二进制文件,以下函数调用将使文件位置指针从文件尾部前移10个sizeof(int),即20个字节:
fseek(pf,-10L*sizeof(int),SEEK_END);
对于文本文件,位移量必须是0。假设pf已指向一个文本文件,以下函数调用将使文件位置指针移到文件的开始:
fseek(pf,0L,SEEK_SET);
假设pf已指向一个文本文件,以下函数调用将使文件位置指针移到文件的末尾:
fseek(pf,0L,SEEK_END);
ftell函数
ftell函数用以获得文件当前位置指针的位置,函数给出当前位置指针相对于文件开头的字节数。若fp已指向一个正确打开的文件,函数的调用形式如下:
long t;
t=ftell(fp);
当函数调用出错时,函数返回-1L。
当打开一个文件时,通常并不知道该文件的长度,通过以下函数调用可以求出文件的字节数:
fseek(fp,0L,SEEK_END);//把位置指针移到文件末尾
t=ftell(fp);//求出文件中的字节数
若二进制文件中存放的是struct st结构体类型数据,则通过以下语句可求出该文件中的以该结构体为单位的数据块的个数:
fseek(fp,0L,SEEK_END);
t=ftell(fp);
n=t/sizeof(struct st);
rewind函数
rewind函数又称“反绕”函数,调用形式如下:
rewind(pf);
此处pf为文件指针。此函数没有返回值,函数的功能是使文件的位置指针回到文件的开头。