如何使用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是相对于起始点的字节偏移数,直接传入你想要的数值即可。
定位到文件中点或任意位置的步骤
- 获取文件总大小(可选,如果你不知道总大小的话):
调用lseek(fd, 0, SEEK_END),这个操作会把文件指针移到文件末尾,同时返回文件的总字节数。 - 定位到目标偏移:
比如你要定位到50字节处,直接调用:
要定位到24字节就传24,76字节就传76,以此类推。如果想定位到文件中点,用总大小除以2作为偏移量即可。lseek(fd, 50, SEEK_SET);
完整代码示例
#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
相关产品推荐
相关产品推荐

