lseek
函数是Linux系统调用之一,用于重新定位文件内的读/写文件偏移量。这个函数允许文件的读写操作不必从文件开头开始,可以从文件的任意位置开始,这对于访问大文件或者进行文件内容的随机访问非常有用。
函数原型
在Linux中,lseek
的函数原型定义在<unistd.h>
头文件中,如下所示:
off_t lseek(int fd, off_t offset, int whence);
- fd:文件描述符,指向要操作的文件。
- offset:相对于
whence
的偏移量,可以是正数也可以是负数。 - whence:偏移量的起始位置,它可以是以下常量之一:
SEEK_SET
:文件的开头。SEEK_CUR
:当前的读写位置。SEEK_END
:文件的末尾。
返回值
- 成功时,返回新的文件偏移量,以字节为单位。
- 失败时,返回-1,并设置
errno
以指示错误。
使用示例
下面是一个使用lseek
函数的简单示例,使用open函数以只读模式打开example.txt文件。然后,我们调用lseek函数将文件的读写位置移动到文件开头后的第10个字节。之后,我们使用read函数从当前位置(即第10字节)开始读取20字节的数据到缓冲区中。读取的数据被打印出来,最后关闭文件。
/*
注意:example.txt文件,文件大小足够(至少30字节),以便此示例能够正常工作
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main() {
// 打开文件
int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Error opening file");
return EXIT_FAILURE;
}
// 使用lseek定位到文件的第10字节
off_t offset = lseek(fd, 10, SEEK_SET);
if (offset == -1) {
perror("Error seeking in file");
close(fd);
return EXIT_FAILURE;
}
// 从当前位置(第10字节)读取20字节数据
char buffer[21]; // 多出一个字节放置字符串结束符'\0'
ssize_t bytesRead = read(fd, buffer, 20);
if (bytesRead == -1) {
perror("Error reading file");
close(fd);
return EXIT_FAILURE;
}
// 确保字符串正确结束
buffer[bytesRead] = '\0';
// 打印读取的数据
printf("Read %ld bytes: '%s'\n", bytesRead, buffer);
// 关闭文件
close(fd);
return EXIT_SUCCESS;
}
注意
- 使用
lseek
进行定位时,并不会实际读写任何数据,它仅仅改变内核中的文件偏移量。 - 对于某些类型的文件(如管道、FIFO、网络套接字),
lseek
函数可能不适用。 lseek
可以用来扩展文件大小,如果将偏移量设置到文件当前大小之外的位置,并进行写操作,文件将会增大。