lseek()
函数用于在打开的文件中设置文件偏移量(file offset)。通过更改文件偏移量,可以控制下一次读取或写入文件时的位置。
lseek()
函数接受三个参数:
-
fd
:一个整数,表示打开文件的文件描述符。这是通过使用open()
函数打开文件后返回的值。 -
offset
:一个off_t
类型的值,表示相对于whence
参数指定的位置的偏移量。可以为正数、负数或零。 -
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;
}
20230811