【文件属性】:
文件名称:lseek函数-数据流图到模块结构图的直接转换方法
文件大小:5.82MB
文件格式:PDF
更新时间:2024-07-12 01:23:28
APUE UNIX
3.6 lseek函数
每个打开文件都有一个与其相关联的“当前文件位移量”。它是一个非负整数,用以度量
从文件开始处计算的字节数。 (本节稍后将对“非负”这一修饰词的某些例外进行说明。 )通常,
读、写操作都从当前文件位移量处开始,并使位移量增加所读或写的字节数。按系统默认,当
打开一个文件时,除非指定O _ A P P E N D选择项,否则该位移量被设置为0。
可以调用l s e e k显式地定位一个打开文件。
#include
#include
off_t lseek(int f i l e d e s, off_t o f f s e t, int w h e n c e) ;
返回:若成功为新的文件位移,若出错为- 1
对参数offset 的解释与参数w h e n c e的值有关。
• 若w h e n c e是S E E K _ S E T,则将该文件的位移量设置为距文件开始处 offset 个字节。
• 若w h e n c e是S E E K _ C U R,则将该文件的位移量设置为其当前值加offset, offset可为正或负。
• 若w h e n c e是S E E K _ E N D,则将该文件的位移量设置为文件长度加offset, offset可为正或负。
若l s e e k成功执行,则返回新的文件位移量,为此可以用下列方式确定一个打开文件的当前
位移量:
off_t currpos;
currpos = lseek(fd, 0, SEEK_CUR);
这种方法也可用来确定所涉及的文件是否可以设置位移量。如果文件描述符引用的是一个管道
或F I F O,则l s e e k返回-1,并将e r r n o设置为E P I P E。
三个符号常数S E E K _ S E T,S E E K _ C U R和S E E K _ E N D是由系统V引进的。在
系统V之前,w h e n c e被指定为 0 (绝对位移量 ),1 (相对于当前位置的位移量 )或
2 (相对文件尾端的位移量)。很多软件仍直接使用这些数字进行编码。
在l s e e k中的字符l表示长整型。在引入o ff _ t数据类型之前,o f f s e t参数和返回值
是长整型的。 l s e e k是由V 7引进的,当时C语言中增加了长整型。 (在V 6中,用函
数s e e k和t e l l提供类似功能。 )
实例
程序3 - 1用于测试其标准输入能否被设置位移量。
程序3-1 测试标准输入能否被设置位移量
3 8 U N I X环境高级编程