博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
5.9 定位流
阅读量:6633 次
发布时间:2019-06-25

本文共 1371 字,大约阅读时间需要 4 分钟。

5.9 定位流

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

(1) ftellfseek。它们都假定文件的位置可以存放在一个长整型中。

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

(3) fgetposfsetpos。这两个函数是新由ANSI C引入的。它们引进了一个新的抽象数据类型fpos_t,它记录文件的位置。这种数据类型可以定义为记录一个文件的位置所需的长度。

需要移植到非UNIX系统上运行的应用程序应当使用fgetposfsetpos

#include 
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表示从文件的尾端。ANSI C并不要求一个实现对二进制文件支持SEEK_END规格说明,其原因是某些系统要求二进制文件的长度是某个幻数的整数倍,非实际内容部分则充填为0。但是在UNIX中,对于二进制文件SEEK_END是得到支持的。

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

除了offset的类型是off_t而非long以外,ftelloftell相同,fseekofseek相同。

#include 
off_t ftello(FILE*fp);//成功返回当前文件位置指示,出错返回-1; int fseeko(FILE*fp, off_t offset, int whence);//成功返回0,出错返回非0; int fgetpos(FILE*restrict fp,fpos_t*restrict pos);//成功返回0,出错返回非0; int fsetpos(FILE*restrict fp,constfpos_t*pos);//成功返回0,出错返回非0;

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

转载于:https://www.cnblogs.com/shaoguangleo/archive/2011/10/08/2805985.html

你可能感兴趣的文章
F5和VMware-共同交付软件定义的数据中心
查看>>
Java并发编程的艺术
查看>>
批量分发ssh公钥证书
查看>>
iOS encrypt Md5, Sha1,Base64
查看>>
git 常用命令
查看>>
Android系统启动流程(四)Launcher启动过程与系统启动流程
查看>>
jquery增,删,改一个html标签的class名字
查看>>
缓存技术
查看>>
怎么样将自己开发的Android应用程序编译到系统Image中
查看>>
Android度量单位说明(DIP,DP,PX,SP)
查看>>
Spring MVC和Struts2的比较的优点
查看>>
Redis配置文件redis.conf详解学习笔记八
查看>>
c++ qt 组播总结
查看>>
RobotFramework BuiltIn关键字笔记
查看>>
Spring整合JMS(四)——事务管理
查看>>
自己封装的golang 操作数据库方法
查看>>
Spring IOC启动流程学习(一)
查看>>
python tornado
查看>>
Android 自动换行的LinearLayout
查看>>
MacBook Pro电池校正
查看>>