上QQ阅读APP看书,第一时间看更新
2.4 文件定位函数
文件中有一个文件位置指针,指向当前读/写字符所在位置。每对文件进行一次读/写后,位置指针就向后移动一个位置,指向下一个字符。为了读/写文件中的某一个字符,需要使用文件定位函数移动位置指针到相应的位置,然后才能读/写该字符。
2.4.1 fseek函数──移动文件位置指针到指定位置
1.函数原型
int fseek(FILE *stream,long int offset,int origin);
2.函数功能
fseek函数的功能是根据offset和origin设置stream指向的文件位置指针的位置。
3.函数参数
(1)参数stream:文件指针,指向文件对象。
(2)参数offset:偏移量,从origin到确定新位置之间的字节数目。
(3)参数origin:文件指针的当前位置。origin的取值可以是0、1和2,它的取值及含义如表2-8所示。
表2-8 origin的取值及含义
4.函数的返回值
如果调用成功,则函数返回0;否则,函数返回非0值。
5.函数范例
/********************************************
*范例编号:02_22
*范例说明:移动文件位置指针到指定位置
*********************************************/
01 #include <stdio.h>
02 #include <stdlib.h>
03 void main()
04 {
05 FILE *fp;
06 char str[81];
07 int result;
08 fp=fopen( “fseek.dat”, “w+” );
09 if( fp==NULL )
10 printf( “Cannot open the file.\n” );
11 else
12 {
13 fputs(“张艳,女,中学教师,河南大学附属中学\n”,fp);
14 fputs(“孙玉胜,男,大学教师,河南大学\n”,fp);
15 fputs(“张志锋,男,大学教师,郑州大学\n”,fp);
16 result = fseek( fp, 0, SEEK_SET);
17 if( result )
18 printf( “Fseek failed!” );
19 else
20 {
21 while(fgets(str,80,fp)!=NULL)
22 {
23 printf( “%s”, str );
24 }
25 }
26 fclose( fp );
27 }
28 system(“pause”);
29 }
该函数范例的运行结果如图2-21所示。
图2-21 函数范例的运行结果
6.函数解析
fseek函数定位文件中的位置指针,类似于字符串中的指针。fseek函数常用于二进制文件,因为文本文件要进行字符转换,在计算时容易产生错误。
2.4.2 ftell函数──得到文件位置指针的当前值
1.函数原型
long int ftell(FILE *stream);
2.函数功能
ftell函数的功能是得到文件位置指针的当前值。这个值是从文件开头算起的字节数。
3.函数参数
参数stream:文件指针,指向文件对象。
4.函数的返回值
如果调用成功,则函数返回相对于文件开头的偏移量;否则,函数返回−1L。
5.函数范例
/********************************************
*范例编号:02_23
*范例说明:得到文件位置指针的当前值
*********************************************/
01 #include <stdio.h>
02 #include <stdlib.h>
03 void main ()
04 {
05 FILE *fp;
06 long len;
07 char buf[81];
08 fp=fopen (“mytest.txt”,”rb”);
09 if (!fp)
10 {
11 printf(“Cannot open the file!”);
12 exit(-1);
13 }
14 else
15 {
16 while(fgets(buf,80,fp)!=NULL)
17 {
18 printf(“Contents of buf:%s”,buf);
19 }
20 fseek (fp, 0L, SEEK_END);
21 len=ftell(fp);
22 fclose (fp);
23 printf (“Length of mytest.txt is %d bytes.\n”,len);
24 }
25 system(“pause”);
26 }
该函数范例的运行结果如图2-22所示。
图2-22 函数范例的运行结果
6.函数解析
将fseek函数与ftell函数结合可以巧妙地计算文件的长度。
2.4.3 rewind函数──将文件位置指针移动到文件的开头
1.函数原型
void rewind(FILE *stream);
2.函数功能
rewind函数的功能是将文件位置指针移动到文件的开始位置。另外,rewind函数还有清除错误标志和清除文件结束符的功能。
3.函数参数
参数stream:文件指针,指向文件对象。
4.函数的返回值
rewind函数没有返回值。
5.函数范例
/********************************************
*范例编号:02_24
*范例说明:利用rewind函数将文件位置指针移动到文件开头读取文件数据
*********************************************/
01 #include <stdio.h>
02 #include <stdlib.h>
03 #define MAXSIZE 50
04 void main ()
05 {
06 FILE *fp;
07 int a[]={1,2,3,4,5,6,7,8,9,10},b[MAXSIZE],i,count=0;
08 fp = fopen (“myfile.dat”,”wb+”);
09 for(i=0;i<sizeof(a)/sizeof(a[0]);i++)
10 fprintf(fp,”%4d”,a[i]);
11 rewind (fp);
12 i=0;
13 while(!feof(fp))
14 {
15 fscanf(fp,”%4d”,&b[i]);
16 count++;
17 i++;
18 }
19 fclose (fp);
20 for(i=0;i<count;i++)
21 printf(“%4d”,b[i]);
22 printf(“\n”);
23 system(“pause”);
24 }
该函数范例的运行结果如图2-23所示。
图2-23 函数范例的运行结果
6.函数解析
rewind函数的作用与下面的函数调用等价。
fseek(stream,0L,SEEK_SET);