lseek()函数的原型及使用方法,超详细

对于所有打开的文件都有一个当前文件偏移量(current file offset),文件偏移量通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数。

读写操作通常开始于当前文件偏移量的位置,并且使其增大,增量为读写的字节数。文件被打开时,文件的偏移量会被初始化为 0,除非使用了O_APPEND 。

读写操作可以使文件的偏移量发生变化;而lseek 函数也可以改变文件的当前位置。下面我们一块来看一下关于lseek函数的原型及使用方法。

通过man手册查看到lseek函数原型如下:需要的头文件为

#include

#include

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

参数:fd:文件描述符

offset:文件偏移量

whence:文件偏移相对位置

返回值:成功:返回文件新的偏移量(成功)

失败:-1(失败)

参数 offset可正可负,负数时向文件开头偏移,正数相对于文件末尾偏移

参数 offset 的含义取决于参数 whence:

1. 如果 whence 是 SEEK_SET,offset相对于文件开头进行偏移

2. 如果 whence 是 SEEK_CUR,offset相对文件当前位置进行偏移

3. 如果 whence 是 SEEK_END,offset相对于文件末尾进行偏移

对于whence参数的选项SEEK_SET、SEEK_CUR 和 SEEK_END 是 System V 引入的,在这之前使用的是 0、1 和 2。

lseek 的以下用法返回当前的偏移量:

off_t currpos;

currpos = lseek(fd, 0, SEEK_CUR);

这个技巧也可用于判断我们是否可以改变某个文件的偏移量。如果参数 fd(文件描述符)指定的是 pipe(管道)、FIFO 或者 socket,lseek 返回 -1 并且置 errno 为ESPIPE。

对于普通文件(regular file),文件偏移量是一个非负整数。但对于特殊设备,文件偏移量有可能是负数。因此,我们不能简单地测试 lseek 的返回值是否小于 0 来判断 lseek 成功与否,而应该测试 lseek 的返回值是否等于 -1 来判断 lseek 成功与否。

lseek 仅将文件偏移位置保存于内核中,不会导致任何 I/O 操作。

如果 offset 比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)”。这就是所谓的在文件里创造“空洞(hole)”。没有被实际写入文件的所有字节由重复的 0 表示。空洞是否占用硬盘空间是由文件系统(file system)决定的。

以下程序创建一个有空洞的文件:

#include

#include

#include

#include

char buf1[] = "abcdefghij";

char buf2[] = "ABCDEFGHIJ";

int main(void)

{

int fd, size;

if ((fd = open("file.hole", O_RDONLY|O_CREATO_TRUNC, 0666)) < 0)

{

printf("open error\n");

return -1;

}

size = sizeof (buf1) - 1;

if (write(fd, buf1, size) != size)

{

printf("buf1 write error\n");

return -1;

}

/* offset now = 10 */

if (lseek(fd, 16384, SEEK_SET) == -1)

{

printf("lseek error\n");

return -1;

}

/* offset now = 16384 */

size = sizeof buf2 - 1;

if (write(fd, buf2, size) != size)

{

printf("buf2 write error\n");

return -1;

}

/* offset now = 16394 */

return 0;

}

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。

(点击找小助理免费领取)扫码进群领资料icon-default.png?t=N7T8https://s.pdb2.com/pages/20230519/16QijNiGb32IFIn.html

  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值