2025-11-20 06:43:00
lseek和fseek都是用来控制文件读写位置的函数,但它们的工作方式完全不同。lseek可以直接跳转到文件的任意位置进行读写,而fseek只能从文件开头或当前位置开始移动。比如要读取文件中间的100字节,用lseek可以直接跳转到100字节的位置,而fseek需要先移动到前面再读。不过lseek最多能跳到的位置受系统限制,通常最多是文件大小的两倍。
之所以lseek最多只能跳到文件大小的两倍,是因为操作系统在处理文件时有个安全机制。比如一个10MB的文件,系统允许lseek最多跳到20MB的位置,但实际写入时只会覆盖到文件末尾。这数据来自Linux内核文档,里面明确写着"lseek偏移量最大值不能超过文件大小的两倍"。而fseek每次移动都是基于当前指针位置,比如从10MB的位置再移动10MB就会越界报错。就像你站在10米深的井底,lseek让你能直接跳到20米的位置,但实际井只有10米深,到头就掉出来了。不过要注意的是,如果文件本身扩展了,比如后来增加到15MB,这时候lseek就能跳到30MB的位置了。
本题链接: