当前位置:嗨网首页>书籍在线阅读

19-fseek()和ftell()的工作原理

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

13.5.1  fseek()ftell() 的工作原理

fseek() 的第1个参数是 FILE 指针,指向待查找的文件, fopen() 应该已打开该文件。

fseek() 的第2个参数是偏移量(offset)。该参数表示从起始点开始要移动的距离(参见表13.3列出的起始点模式)。该参数必须是一个 long 类型的值,可以为正(前移)、负(后移)或 0 (保持不动)。

fseek() 的第3个参数是模式,该参数确定起始点。根据ANSI标准,在 stdio.h 头文件中规定了几个表示模式的明示常量(manifest constant),如表13.3所示。

表13.3 文件的起始点模式

| 模式 | 偏移量的起始点 | | :----- | :----- | :----- | :----- | | SEEK_SET | 文件开始处 | | SEEK_CUR | 当前位置 | | SEEK_END | 文件末尾 |

旧的实现可能缺少这些定义,可以使用数值 0L1L2L 分别表示这3种模式。 L 后缀表明其值是 long 类型。或者,实现可能把这些明示常量定义在别的头文件中。如果不确定,请查阅实现的使用手册或在线帮助。

下面是调用 fseek() 函数的一些示例, fp 是一个文件指针:

fseek(fp, 0L, SEEK_SET);     // 定位至文件开始处
fseek(fp, 10L, SEEK_SET);    // 定位至文件中的第10个字节
fseek(fp, 2L, SEEK_CUR);     // 从文件当前位置前移2个字节
fseek(fp, 0L, SEEK_END);     // 定位至文件结尾
fseek(fp, -10L, SEEK_END);   // 从文件结尾处回退10个字节

对于这些调用还有一些限制,我们稍后再讨论。

如果一切正常, fseek() 的返回值为 0 ;如果出现错误(如试图移动的距离超出文件的范围),其返回值为 -1

ftell() 函数的返回类型是 long ,它返回的是参数指向文件的当前位置距文件开始处的字节数。ANSI C把它定义在 stdio.h 中。在最初实现的UNIX中, ftell() 通过返回距文件开始处的字节数来确定文件的位置。文件的第1个字节到文件开始处的距离是 0 ,以此类推。ANSI C规定,该定义适用于以二进制模式打开的文件,以文本模式打开文件的情况不同。这也是程序清单13.4以二进制模式打开文件的原因。

下面,我们来分析程序清单13.4中的基本要素。首先,下面的语句:

fseek(fp, 0L, SEEK_END);

把当前位置设置为距文件末尾 0 字节偏移量。也就是说,该语句把当前位置设置在文件结尾。下一条语句:

last = ftell(fp);

把从文件开始处到文件结尾的字节数赋给 last

然后是一个 for 循环:

for (count = 1L; count <= last; count++)
{
     fseek(fp, -count, SEEK_END); /* go backward */
     ch = getc(fp);
}

第1轮迭代,把程序定位到文件结尾的第1个字符(即,文件的最后一个字符)。然后,程序打印该字符。下一轮迭代把程序定位到前一个字符,并打印该字符。重复这一过程直至到达文件的第1个字符,并打印。