分类: 系统运维
2012-03-29 12:03:32
有三种方式来定位一个标准I/O流:
1、两个函数ftell和fseek。它们在Version 7出现,但它们假设一个文件位置可以用一个长整型存储;
2、两个函数ftello和fseeko。它们在SUS引入,来允许文件可能不适合长整型的文件偏移量。它们用off_t数据类型代码长整型;
3、两个函数fgetpos和fsetpos。它们被ISO C引入。它们用一个抽象数据类型fpos_t,来记录一个文件的位置。这个数据类型可以是记录一个文件位置所需而随意大。
想移到非UNIX系统的可移植的程序应该使用fgetpos和fsetpos。
对于一个二进制文件,一个文件的位置指示器是从文件开始的字节来衡量的。ftell为二进制文件的返回值是这个字节位置。为了用fseek定位一个二进制
文件,我们必须指定一个字节偏移以及这个偏移如何被解释。whence的值和3.9节的lseek函数里的一样:SEEK_SET表示从文件开头开
始;SEEK_CUR表示从当前文件位置开始;SEEK_END表示从文件末尾开始。ISO
C没有要求一个实现支持二进制文件的SEEK_END,因为一些系统要求一个二进制文件在末尾添加一些0以及文件大小为一些魔数的整数。然而,在UNIX
系统,SEEK_END用来支持二进制文件。
对于文本文件,文件的当前位置可能不能简单用字节偏移来测量。一些非UNIX系统下可能把文本文件存储成另一种格式。为了定位一个文本文件,whence
必须是SEEK_SET,而且只有两个值被允许:0-表示回到开始,或一个由ftell返回的值。一个流也可以用rewind函数回到文件开头。
ftello函数和ftell函数相同,而fseeko函数和fseek函数相同,除了偏移量的类型是off_t而不是long。
回想下3.6节关于off_t数据类型的讨论。实现可以把off_t类型定义的比32位更大。
正如我们提到的,fgetpos和fsetpos函数由ISO C标准引入。
fgetpos返回把文件位置指示器的值存储在由pos指向的对象里。这个值可以被之后的fsetpos调用使用,来重定位流的位置。