C语言:随机访问fseek()和ftell()
作者:互联网
随机访问fseek()和ftell()
有了fseek()
函数,便可把文件看作是数组,在fopen()
打开的文件中直接移动到任意字节处。
下面代码演示了fseek()
和ftell()
的用法:
#include <stdio.h>
#include <stdlib.h>
#define CNTL_Z '\032' /* DOS文本文件中的文件结尾标记 */
#define SLEN 81
int main(void) {
char ch;
FILE *fp;
long count, last;
char file[] = "C:\\Users\\MSI-\\Desktop\\test.txt";
if ((fp = fopen(file, "rb")) == NULL)
{ /* 只读模式 */
printf("reverse can't open %s\n", file);
exit(EXIT_FAILURE);
}
fseek(fp, 0L, SEEK_END); /* 定位到文件末尾 */
last = ftell(fp); //返回字节数
for (count = 1L; count <= last; count++)
{
fseek(fp, -count, SEEK_END); /* 回退 */
ch = getc(fp);
if (ch != CNTL_Z && ch != '\r') /* MS-DOS 文件 */
putchar(ch);
}
putchar('\n');
fclose(fp);
return 0;
}
文件内容和输出:
该程序使用二进制模式,以便处理MS-DOS文本和UNIX文件。但是,在使用其他格式文本文件的环境中可能无法正常工作。
fseek()和ftell()的工作原理
fseek
fseek()
的第一个参数是FILE
指针,指向待查找的文件。
fseek()
的第二个参数是偏移量,该参数表示从起点开始要移动的距离。该参数必须是一个long类型的值,可以为正(前移)、负(后移)、0(保持不动)。
fseek()
的第三个参数是模式,该参数确定起始点(参见下表列出的起始点模式)。根据ANSI标准,在stdio.h
头文件中规定了几个表示模式的明示常量:
模式 | 偏移量的起始点 | 数值 |
---|---|---|
SEEK_SET | 文件开始出 | 0L |
SEEK_CUR | 当前位置 | 1L |
SEEK_END | 文件末尾 | 2L |
下面是调用fseek函数的例子:
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
ftell()函数返回类型是long,它返回的是参数指向文件的当前位置距文件开始处的字节数。ANSI C把它定义在stdio.h中。在最初实现的UNIX中,ftell()通过返回距文件开始处的字节数来确定文件的位置。文件的第1个字节到文件开始处的距离是0,以此类推。ANSI C规定,该定义适用于以二进制模式打开的文件,以文本模式打开文件的情况不同。
把当前位置设置为距文件末尾0字节偏移量。也就是说,该语句把当前位置设置在文件结尾。
fseek(fp, 0L, SEEK_END);
把从文件开始处到文件结尾的字节数赋给last。
last = ftell(fp);
fgetpos()和fsetpos()函数
fseek()
和ftell()
潜在的问题是,他们都把文件大小都限制在long
类型能表示的范围内。
鉴于此,ANSI C新增了两个处理较大文件的新定位函数:
fgetpos()
和fsetpos()
。这两个函数不使用long
类型的值表示位置,它们使用一种新类型:fpos_t
(代表file position type,文件定位类型)。
fpos_t
类型不是基本类型,它根据其他类型来定义。
fpos_t
类型的变量或数据对象可以在文件中指定一个位置,它不能是数组类型,除此之外,没有其他限制。实现可以提供一个满足特殊平台要求的类型,例如,fpos_t
可以实现为结构体。
ANSI C定义了如何使用fpos_t
类型。fgetpos()
函数的原型如下:
int fgetpos(FILE * restrict stream, fpos_t * restrict pos);
调用该函数时,它把fpos_t
类型的值放在pos
指向的位置上,该值描述了文件中的当前位置距文件开头的字节数。如果成功,fgetpos()
函数返回0;如果失败,返回非0。
fsetpos()
函数的原型如下:
int fsetpos(FILE *stream, const fpos_t *pos);
调用该函数时,使用pos
指向位置上的fpos_t
类型值来设置文件指针指向偏移该值后指定的位置。如果成功,fsetpos()
函数返回0;如果失败,则返回非0。fpos_t
类型的值应通过之前调用fgetpos()
获得。
标签:fp,文件,fseek,fpos,C语言,ftell,SEEK 来源: https://www.cnblogs.com/wwjj4811/p/16658474.html