linux文件编程-lseek

lseek() 函数用于在打开的文件中设置文件偏移量(file offset)。通过更改文件偏移量,可以控制下一次读取或写入文件时的位置。

lseek() 函数接受三个参数:

  1. fd:一个整数,表示打开文件的文件描述符。这是通过使用 open() 函数打开文件后返回的值。

  2. offset:一个 off_t 类型的值,表示相对于 whence 参数指定的位置的偏移量。可以为正数、负数或零。

  3. whence:一个整数,指定了对 offset 进行解释的方式。可以使用以下值之一:

    • SEEK_SET:从文件的开头开始计算偏移量。
    • SEEK_CUR:从当前位置开始计算偏移量。
    • SEEK_END:从文件的末尾开始计算偏移量。

lseek() 函数返回一个 off_t 类型的值,表示设置后的文件偏移量。如果设置失败,将返回 -1,并且可以通过检查错误号(errno)来获取具体的错误信息。

为什么要使用 lseek() 函数?

  • 定位文件:可以使用 lseek() 函数在文件中设置任何位置的文件偏移量,以便读取或写入文件的特定位置。

  • 随机访问:通过更改文件偏移量,可以实现对文件的随机访问,而不是按顺序逐个读取或写入文件。

  • 文件截断:lseek() 函数还可以与 ftruncate() 函数结合使用来截断文件的长度。

  • 每次结束写操作后,如果想从头读取文件内容记得定位到文件开头

  • lseek(fd,0,SEEK_SET);
  • 也可以用来计算文件的大小

  • #include <unistd.h>
    
    off_t lseek(int fd, off_t offset, int whence);
    

下面是对lseek函数的应用

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

int main(void)
{
    int fd; // 文件描述符
    char * buf = "guoda handsome !"; // 要写入文件的字符串

    fd = open("./file1", O_RDWR); // 以可读写方式打开文件
    if (fd == -1)
        printf("fd=%d open file1 fail\n", fd);

    fd = open("./file1", O_RDWR | O_CREAT, 0600); // 如果文件不存在,则创建文件
    printf("fd=%d open file1 SUCCESS\n", fd);

    int write_size = write(fd, buf, strlen(buf)); // 向文件中写入字符串
    printf("write %d\n", write_size);

    /* 
       写入操作之后,文件偏移量会停留在文件末尾,
       因此我们可以关闭文件再重新打开来将文件偏移量设置为开头位置。
       但在这段代码中,重新打开的文件并没有进行操作。
    */
    // close(fd);
    // fd = open("./file1", O_RDWR);
    

    char *readbuf;
    readbuf = (char *)malloc(sizeof(char) * write_size); // 动态分配内存用于保存读取的数据
    lseek(fd, 6, SEEK_SET); // 将文件偏移量设置为第6个字节的位置
    int read_size = read(fd, readbuf, write_size - 6); // 从文件中读取数据
    
    printf("read %d readbuf:%s\n", read_size, readbuf);
    free(readbuf); // 释放动态分配的内存空间
    close(fd); // 关闭文件描述符

    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MichstaBe#

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值