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

Linux系统中为何lseek(fd1,0,SEEK_END)结果等于文件大小+1?

为什么lseek(fd1,0,SEEK_END)返回值等于文件大小加1?

这个问题其实是对lseek返回值和文件偏移量概念的常见误解,咱们一步步拆解清楚:

首先得明确一个核心概念:lseek(fd, 0, SEEK_END)的返回值就是文件的实际字节大小。因为文件的偏移量是从0开始计数的:

  • 比如一个文件有10个字节,第1个字节的偏移位置是0,第10个字节的偏移位置是9,而文件末尾(也就是下一个要写入数据的位置)的偏移量就是10,刚好等于文件的字节大小。

那你觉得返回值是「文件大小+1」,大概率是这两种情况:

  • 对文件实际大小的判断有误
    比如你用文本编辑器创建f3.txt时,很多编辑器会自动在文件末尾添加换行符(\n)。举个例子:你手动输入了"helloworld"(10个字节),但编辑器保存后变成了"helloworld\n"(11个字节)。这时候你以为文件大小是10,但实际是11,lseek返回11,你就会觉得是10+1=11。
    你可以在终端用wc -c f3.txt命令查看文件的实际字节数,和lseek的返回值对比验证。

  • 混淆了字符数和字节数
    如果你的文件包含多字节字符(比如中文),你数的是字符个数,但lseek返回的是字节数。不过这种情况通常不会刚好差1,所以可能性相对较低。

你可以在代码里加一段验证逻辑,直接打印文件的实际大小:

// 在open成功后添加这段代码
struct stat st;
if (fstat(fd1, &st) == 0) {
    printf("Actual file size (bytes): %ld\n", st.st_size);
}

把这个输出和lseek(fd1, 0, SEEK_END)的结果对比,就能确认两者是否一致。

最后补充一句:lseek只是修改文件描述符的偏移指针,不会实际读写文件内容,它的返回值完全基于文件当前的实际字节大小计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:46:31