C/C++函数与算法速查宝典
上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);