`lseek` 是一个在 Unix 和 Linux 系统编程中常用的系统调用,用于改变文件描述符上的文件偏移量。其主要目的是对文件进行读取或写入操作前设定一个位置标记。该调用的原型是:
```c
off_t lseek(int fd, off_t offset, int whence);
```
参数说明:
* `fd`:文件描述符,它是一个整数,用于标识一个打开的文件。
* `offset`:偏移量,表示从文件的某个位置开始偏移的字节数。这可以是负数,表示向前移动。
* `whence`:起始点,表示从文件的哪个位置开始计算偏移量。它有三个可能的值:
+ `SEEK_SET`:从文件的起始点开始计算偏移量。
+ `SEEK_CUR`:从文件的当前位置开始计算偏移量。
+ `SEEK_END`:从文件的末尾开始计算偏移量。
返回值:
* 成功时返回新的文件偏移量。这是一个相对于文件开头的偏移量。
* 失败时返回 -1,并设置 `errno` 以指示错误原因。
一个简单的使用示例可能是这样的:
```c
#include
#include
#include
#include
int main() {
int fd = open("file.txt", O_RDONLY); // 打开文件以供读取
if (fd == -1) {
perror("open"); // 打印错误信息
return 1; // 返回错误代码
}
off_t offset = 5; // 从文件的第 5 个字节开始读取数据
off_t newOffset = lseek(fd, offset, SEEK_SET); // 设置新的文件偏移量并获取新的偏移量值
if (newOffset == -1) { // 检查是否成功设置偏移量
perror("lseek"); // 打印错误信息
close(fd); // 关闭文件描述符并退出程序
return 1; // 返回错误代码
} else {
printf("新的文件偏移量为:%ld\n", newOffset); // 打印新的偏移量值(相对于文件开头)
}
close(fd); // 关闭文件描述符并退出程序(确保资源被释放)
return 0; // 返回成功代码(如果所有操作都成功执行)
}
```
注意:使用 `lseek` 可以改变文件的读取或写入位置,但并不会改变文件的内容本身。它只是改变了下一次读取或写入操作的位置标记。