Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1814608
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: 系统运维

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。



  1. #include <stdio.h>

  2. long ftell(FILE *fp);

  3. 如果成功返回当前文件位置指示器,错误返回-1L。

  4. int fseek(FILE *fp, long offset, int whence);

  5. 成功返回0,否则返回非0值。

  6. void rewind(FILE *fp);


对于一个二进制文件,一个文件的位置指示器是从文件开始的字节来衡量的。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。



  1. #include <stdio.h>

  2. off_t ftello(FILE* fp);

  3. 成功返回当前文件位置,否则返回(off_t)-1。

  4. int fseeko(File *fp, off_t offset, int whence);

  5. 成功返回0,失败返回非0.


回想下3.6节关于off_t数据类型的讨论。实现可以把off_t类型定义的比32位更大。

正如我们提到的,fgetpos和fsetpos函数由ISO C标准引入。



  1. #inlcude <stdio.h>

  2. int fgetpos(FILE *restrict fp, fpos_t *restrict pos);

  3. int fsetpos(FILE *fp, const fpos_t *pos);

  4. 两者成功都返回0,失败返回非0值。


fgetpos返回把文件位置指示器的值存储在由pos指向的对象里。这个值可以被之后的fsetpos调用使用,来重定位流的位置。

阅读(919) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~