首页 理论教育C语言程序设计第2版:文件定位成功

C语言程序设计第2版:文件定位成功

【摘要】:例如,起始位置为文件头,偏移量为50,则表示将读写指针移到相对文件头距离50个字节的位置。表9.2文件指针起始位置的设置方法说明: 0表示相对于文件头; 1表示相对于文件的当前位置; 2表示相对于文件尾。例9.8建立一个数据文件,随机读取其中的某个数据。例9.9文件位置指针复位函数rewind()的应用。例9.10编写一个程序使用frell()函数估算一个文件的大小。

如果想改变系统默认的读写顺序,即希望对于文件上当前位置以外的某些位置进行操作,可以使用有关对文件指针定位的函数来调整文件指针(读写头)的位置。

1.定位读写指针函数fseek()

fseek()函数的功能是将文件的读写指针从某个位置移到指定的位置,该函数为C语言对文件的随机读写提供了方法。fseek()函数调用格式如下:

fseek(fp,偏移量,起始位置)

其中,fseek是该函数的函数名;fp是指向被操作文件的文件指针;“偏移量”是表示移动当前读写指针的距离量,该参数的类型为long int型;“起始位置”是偏移量的相对位置。例如,起始位置为文件头,偏移量为50,则表示将读写指针移到相对文件头距离50个字节的位置。起始位置的设置方法参见表9.2。

表9.2 文件指针起始位置的设置方法

说明:
0表示相对于文件头;
1表示相对于文件的当前位置;
2表示相对于文件尾。

实际中,常用宏定义来替代起始位置:

SEEK_SEC表示文件头;

SEEK_CUR表示当前位置;

SEEK_END表示文件尾。

例如:

fseek(fp,200L,0); /*将读写指针移到离文件头20个字节处。*/

fseek(fp,80L,1);  /*将读写指针移到离当前位置80个字节处。*/

fseek(fp,-50L,0); /*将读写指针移到从文件尾向前50个字节处。*/

该函数一般用于二进制文件。如果将其用于文本文件,则计算位置时会发生误差。

例9.8 建立一个数据文件,随机读取其中的某个数据。(www.chuimin.cn)

使用fprintf()函数建立一个数据文件xy.Dat,然后指定从某个数据起连续读出若干个数据,最后再读出这组数据的起始数据。

该程序先打开一个文件b.txt,以二进制数的读写方式,用for循环语句向文件中写入20个整型数,这里使用的是fprintf()函数。再从键盘上键入一个数值赋给x,表示从文件中第x个数据项开始读取数据,并将它显示在屏幕上。

本程序中,指定从第10个数据项开始,连续读出5个数据项,暂存在变量Y中并输出到显示屏幕上。这里使用fseek()函数进行定位,让读写指针移到第10个数据项,并从该数据项开始输出。程序中又使用fseek()函数重新定位读写指针,使它再指向第10个数据项,再读取该数据,输出显示为10。

2.复位读写指针函数rewind()

rewind()函数的功能是将某个文件的读写指针重置于文件头。该函数的调用格式如下:

rewind(fp);

其中,rewind是该函数的函数名,fp是被操作文件的文件指针。使用该函数后,会使被操作文件的读写指针指向文件头。

例9.9 文件位置指针复位函数rewind()的应用。

程序首先在文件d.txt上依次输出了abc,然后将文件指针移动到文件的开始位置,再输出A,将原来此位置上的a覆盖了,最后文件d.txt的内容为Abc.

3.返回读写指针函数ftell()

ftell()函数的功能是返回指定文件当前读写指针的位置,是用该位置相对于文件头间隔的字节数来表示。例如,该函数返回某个文件的当前读写指针的位置是100字节,即表示当前读写指针在离文件头100个字节处。该函数调用格式如下:

ftell(fp);

它返回一个表示字节数的long int型数值。

例9.10 编写一个程序使用frell()函数估算一个文件的大小。