(十)lseek函数的介绍和使用


  每个打开的文件都记录着当前读写位置,打开文件时读写位置是0,表示文件开头,通常读写多少个字节就会将读写位置往后移多少个字节。但是有一个例外,如果以O_APPEND方式打开,每次写操作都会在文件末尾追加数据,然后将读写位置移到新的文件末尾。lseek和标准I/O库的fseek函数类似,可以移动当前读写位置(或者叫偏移量)。

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

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


  参数offset和whence的含义和fseek函数完全相同。只不过第一个参数换成了文件描述符。和fseek一样,偏移量允许超过文件末尾,这种情况下对该文件的下一次写操作将延长文件,中间空洞的部分读出来都是0。
  若lseek成功执行,则返回新的偏移量,因此可用以下方法确定一个打开文件的当前偏移量:

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


  这种方法也可用来确定文件或设备是否可以设置偏移量,常规文件都可以设置偏移量,而设备一般是不可以设置偏移量的。如果设备不支持lseek,则lseek返回-1,并将errno设置为ESPIPE。注意fseek和lseek在返回值上有细微的差别,fseek成功时返回0失败时返回-1,要返回当前偏移量需调用ftell而lseek成功时返回当前偏移量失败时返回-1。


一个小例子:(先要创建一个abc文件)

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

int main()
{
    int fd = open("abc",O_RDWR);
    if(fd < 0)
    {
        perror("open abc");
        exit(-1);
    }
    //拓展文件大小,用od -tcx abc命令查看结果
    lseek(fd, 0X1000,SEEK_SET);
    write(fd, "a", 1);

    //用lseek获取文件大小
    printf("abc's size:%d\n",(int)lseek(fd,0,SEEK_END));

    close(fd);
    return 0;
}
`lseek()` 是一个系统调用函数,用于在文件中进行随机访问。它可以改变文件读写指针的位置,从而实现对文件的任意位置读写操作。`lseek()` 函数的原型如下: ```c off_t lseek(int fd, off_t offset, int whence); ``` - `fd` 是文件描述符,表示要进行操作的文件。 - `offset` 是偏移量,表示要移动的字节数。 - `whence` 是起始位置,可以是以下几个值之一: - `SEEK_SET`:从文件开头开始计算偏移量。 - `SEEK_CUR`:从当前读写位置开始计算偏移量。 - `SEEK_END`:从文件末尾开始计算偏移量。 `lseek()` 函数返回新的读写指针位置,如果出现错误,则返回值为 -1。 使用示例: ```c #include <fcntl.h> #include <unistd.h> int main() { int fd = open("example.txt", O_RDONLY); // 打开文件(只读模式) if (fd == -1) { perror("open"); return -1; } off_t offset = lseek(fd, 10, SEEK_SET); // 从文件开头偏移10个字节 if (offset == -1) { perror("lseek"); close(fd); return -1; } char buffer[100]; ssize_t bytesRead = read(fd, buffer, sizeof(buffer)); // 读取数据 if (bytesRead == -1) { perror("read"); close(fd); return -1; } close(fd); // 关闭文件 // 打印读取的数据 write(STDOUT_FILENO, buffer, bytesRead); return 0; } ``` 在上面的示例中,我们首先通过 `open()` 函数打开一个文件,并获得文件描述符 `fd`。然后,我们使用 `lseek()` 函数读写指针从文件开头偏移10个字节。接下来,我们使用 `read()` 函数从当前读写位置读取数据到缓冲区 `buffer` 中。最后,我们使用 `write()` 函数将读取到的数据打印到标准输出。 这是一个简单的使用 `lseek()` 函数进行文件随机访问的示例。你可以根据需要自行调整偏移量起始位置,并进行更复杂的文件操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值