有三种方法定位标准I/O流。

(1)ftell和fseek函数。这两个函数自V7以来就存在了,但是它们都假定文件的位置可以存放在一个长整型中。

(2)ftello和fseeko函数。Single UNIX Specification引入了这两个函数,可以使文件偏移量不必一定使用长整型。它们使用off_t数据类型代替了长整型。

(3)fgetpos和fsetpos函数。这两个函数是由ISO C引入的。它们使用一个抽象数据类型fpos_t记录文件的位置。这种数据类型可以定义为记录一个文件位置所需的长度。

需要移植到非UNIX系统上运行的应用程序应当使用fgetpos和fsetpos。

#include <stdio.h>

long ftell( FILE *fp );
返回值:若成功则返回当前文件位置指示,若出错则返回-1L int fseek( FILE *fp, long offset, int whence );
返回值:若成功则返回0, 若出错则返回非0值 void rewind( FILE *fp );

对于一个二进制文件,其文件位置指示器是从文件起始位置开始度量,并以字节为计量单位。ftell用于二进制文件时,其返回值就是这种字节位置。为了用fseek定位一个二进制文件,必须指定一个字节offset,以及解释这种偏移量的方式。whence的值与lseek函数的相同:SEEK_SET表示从文件的起始位置开始,SEEK_CUR表示从当前文件位置开始,SEEK_END表示从文件的尾端开始。

对于文本文件,它们的文件当前位置可能不以简单的字节偏移量来度量。这主要也是在非UNIX系统中,它们可能以不同的格式存放文本文件。为了定位一个文本文件,whence一定要是SEEK_SET,而且offset只能有两种值:0(绕回到文件的起始位置),或是对该文件调用ftell所返回的值。使用rewind函数也可以将一个流设置到文件的起始位置。

除了offset的类型是off_t而long以外,ftello函数与ftell相同,fseeko函数与fseek相同。

#include <stdio.h>

off_t ftello( FILE *fp );
返回值:若成功则返回当前文件位置指示,若出错则返回- int fseeko( FILE *fp, off_t offset, int whence );
返回值:若成功则返回0,若出错则返回非0值

fgetpos和fsetpos这两个函数是C标准引进的。

#include <stdio.h>

int fgetpos( FILE *restrict fp, fpos_t *restrict pos );
int fsetpos( FILE *fp, const fpos_t *pos );
两个函数返回值:若成功则返回0,若出错则返回非0值

fgetpos函数将文件位置指示器的当前值存入由pos指向的对象中。在以后调用fsetpos时,可以使用此值将流重新定位至该位置。

本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/

05-08 15:51