文件I/O

文件I/O之函数lseek

每个打开的文件都有一个与其关联的“当前文件偏移量”,它通常是一个非负整数,用以度量从文件开始处计算的字节数。

通常,读、写操作都从当前文件偏移量处开始,并使偏移量增加读写的字节数。

按系统默认的情况,当打开一个文件时,除非指定O_APPEND选项,否则该偏移量被设置为0。

可以调用lseek显式地为一个打开文件设置偏移量。

#include<unistd.h>
off_t  lseek(int fd,  off_t   offset ,  int  whence);
success: 返回文件偏移量
failure: 返回-1

对参数的解释和whence参数有关:

  • 若whence是SEEK_SET, 则将该文件的偏移量设置距文件开始处offset个字节。
  • 若whence是SEEK_CUR, 则将该文件的偏移量设置为其当前值加offset,offset可为正或者负。
  • 若whence是SEEK_END, 则将该文件的偏移量设置为文件长度加offset, offset可正可负。

可以用下面的方法来确定打开文件的当前偏移量:

off_t  currpos;
currpos = lseek(fd,  0 ,  SEEK_CUR);

这种方法也可以用来判断文件是否支持偏移量的设置,如果文件描述符是一个管道、FIFO或者网络套接字,则lseek返回-1, 并将errno设置为ESPIPE。
小知识

3个常量SEEK_SET 、SEEK_CUR 、和SEEK_END是在System V中引入的。在System V之前,whence被指定为0(绝对偏移量)、1(相对当前位置的偏移量)、2(相对文件末端的偏移量)。很多文件任然把这些数字直接写到程序代码里。
lseek 这个单词的第一个字符l 表示长整形。在引入off_t数据类型之前,offset参数和返回值是长整形的。lseek是在unix v7 版本中引入的, 当时C语言中增加了长整形(在unix v6 版本中,用函数seek和tell提供类似功能)。

demo

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值