Linux中为何lseek(1.txt,0,SEEK_END)等于文件大小+1?空文件返回0?
问题
在Linux系统中,为何调用lseek(1.txt, 0, SEEK_END)的返回值等于文件中的文本数量加1,但当文件为空时,lseek()的返回值为0?
测试代码
#include<stdio.h> #include<unistd.h> #include<fcntl.h> int main(int argc, char *argv[]){ int fd; fd=open(argv[1], O_RDWR); printf("file size : %ld\n",lseek(fd, (off_t)0 ,SEEK_END)); }
解答
- 本质上
lseek(fd, 0, SEEK_END)的返回值就是文件的实际字节总长度,不存在“文本数量加1”的特殊规则。你看到的差异大概率是因为文件里藏了个换行符:比如手动编辑文件时,输入内容后按回车结束,编辑器会自动在末尾追加一个\n(换行符,占1字节),而你统计“文本数量”时只算了可见字符,没把这个隐藏的换行符算进去,所以才觉得返回值多了1。 - 空文件的字节长度本身就是0,所以
lseek返回0是完全正常的,符合空文件的长度定义。 - 想验证的话,直接用
od -c 1.txt命令查看文件的所有字节,就能看到包括换行符在内的所有字符,此时字节总数和lseek的返回值会完全匹配。
内容的提问来源于stack exchange,提问作者SSS
相关产品推荐
相关产品推荐

