文件I/O操作函数 lseek()

lseek()

函数说明

每一个已打开的文件都有一个读写位置, 当打开文件时通常其读写位置是指向文件开头,

若是以附加的方式打开文件(如O_APPEND), 则读写位置会指向文件尾.

当read()或write()时, 读写位置会随之增加,lseek()便是用来控制该文件的读写位置.

头文件

#include <sys/types.h>
#include <unistd.h>

函数原型

off_t lseek(int fildes, off_t offset, int whence);

函数参数

filedes:文件描述符
 offset:相对于whence的偏移量,以字节为单位。正数向前移动,负数向后移动
 whence:当前位置的基准点(3种)
      1.SEEK_SET:文件的起始位置
      2.SEEK_CUR:文件当前读写位置
      3.SEEK_END:文件的结束位置
返回值  成功:返回目前的读写位置, 也就是距离文件开头多少个字节.
 -1:出错   errno 会存放错误代码.
备注lseek() 只对常规文件有效  对socket 管道 FIFO等无效
 lseek() 仅将当前的位移量记录在内核中,并不引起任何I/O操作。
 

文件位移量可以大于当前的文件长度,在这中情况下,

对该文件的写操作会延长文件,形成空洞。并不占用真实空间。

使用方法

1.将读写位置移到文件开头时:lseek(int fildes, 0, SEEK_SET);
 2.将读写位置移到文件尾时:lseek(int fildes, 0, SEEK_END);
 3.取得目前文件位置时:lseek(int fildes, 0, SEEK_CUR);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

例1:利用lseek() 计算文件大小

#include <stdio.h>
#include <stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>

int main(int argc,char *argv[])
{
    int fd, length;
    
    if (argc<2) {
        puts("Please input the open file pathname!\n");
        exit(1);
    }
    
    if ((fd=open(argv[1], O_RDONLY))<0) {
        perror("open error");
        exit(1);
    }
    
    /* The offset is set to the size of the file plus 0(offset) bytes. */
    if ((length = lseek(fd, 0, SEEK_END))<0 ) {
        perror("lseek error");
    }
    printf("The file's length is %d\n",length);
    
    close(fd);
    exit(0);
}

 

例2:创建一个空洞文件,思考空洞文件的用途。

#include "apue.h"
#include <fcntl.h>

char    buf1[] = "abcdefghij";
char    buf2[] = "ABCDEFGHIJ";

int
main(void)
{
    int     fd;

    if ((fd = creat("file.hole", FILE_MODE)) < 0)
        err_sys("creat error");

    if (write(fd, buf1, 10) != 10)
        err_sys("buf1 write error");
    /* offset now = 10 */

    if (lseek(fd, 16384, SEEK_SET) == -1)
        err_sys("lseek error");
    /* offset now = 16384 */

    if (write(fd, buf2, 10) != 10)
        err_sys("buf2 write error");
    /* offset now = 16394 */

    exit(0);
}

 

转载于:https://www.cnblogs.com/CloudPing/p/3802557.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值