You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用lseek()定位到文件的中点位置?

解决lseek()定位到文件任意位置的问题

首先纠正你对lseek()的误解:SEEK_SET、SEEK_CUR、SEEK_END是定位的起始基准标志,不是可运算的数值。你要定位到任意偏移位置(比如24、50、76),只需要把目标偏移量作为第二个参数,搭配对应的基准标志即可。

核心用法说明

lseek()的函数原型是:

off_t lseek(int fd, off_t offset, int whence);
  • whence指定偏移的起始点:
    • SEEK_SET:从文件开头开始计算偏移
    • SEEK_CUR:从当前文件指针位置开始计算偏移
    • SEEK_END:从文件末尾开始计算偏移(偏移量可以为负,表示往前移)
  • offset是相对于起始点的字节偏移数,直接传入你想要的数值即可。

定位到文件中点或任意位置的步骤

  1. 获取文件总大小(可选,如果你不知道总大小的话):
    调用lseek(fd, 0, SEEK_END),这个操作会把文件指针移到文件末尾,同时返回文件的总字节数。
  2. 定位到目标偏移:
    比如你要定位到50字节处,直接调用:
    lseek(fd, 50, SEEK_SET);
    
    要定位到24字节就传24,76字节就传76,以此类推。如果想定位到文件中点,用总大小除以2作为偏移量即可。

完整代码示例

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    // 打开文件(只读模式)
    int fd = open("word_file.txt", O_RDONLY);
    if (fd == -1) {
        perror("open failed");
        return 1;
    }

    // 可选:获取文件总大小
    off_t file_size = lseek(fd, 0, SEEK_END);
    if (file_size == -1) {
        perror("lseek get size failed");
        close(fd);
        return 1;
    }
    printf("文件总大小:%ld字节\n", file_size);

    // 定位到50字节处(文件中点,假设总大小100)
    off_t target_offset = 50;
    off_t pos = lseek(fd, target_offset, SEEK_SET);
    if (pos == -1) {
        perror("lseek to target failed");
        close(fd);
        return 1;
    }
    printf("当前文件指针位置:%ld字节\n", pos);

    // 从该位置读取内容
    char buf[10];
    ssize_t read_len = read(fd, buf, sizeof(buf)-1);
    if (read_len > 0) {
        buf[read_len] = '\0';
        printf("读取到的内容:%s\n", buf);
    }

    close(fd);
    return 0;
}

关键注意点

  • 你之前尝试的SEEK_SET/2是错误的用法,SEEK_SET是一个宏(通常值为0),除法运算没有意义。正确的做法是直接传入目标偏移数值,搭配SEEK_SET基准。
  • 如果文件中的单词包含换行、空格等分隔符,实际字节数会比10*5=50多,定位时要根据实际文件结构调整偏移量。

内容的提问来源于stack exchange,提问作者mistahwhite

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 17:05:20