C 如何使用lseek()确定偏移光标是否位于EOF?
如何仅使用C 如何使用lseek()确定偏移光标是否位于EOF?,c,eof,libc,lseek,C,Eof,Libc,Lseek,如何仅使用lseek()确定偏移光标当前是否处于EOF?返回(新)位置。如果可以接受文件位置在测试结束后,则以下操作有效: off_t old_position = lseek(fd, 0, SEEK_CUR); off_t end_position = lseek(fd, 0, SEEK_END); if(old_position == end_position) { /* cursor already has been at the end */ } 现在,光标在末尾,不管它是否已
lseek()
确定偏移光标当前是否处于EOF?返回(新)位置。如果可以接受文件位置在测试结束后,则以下操作有效:
off_t old_position = lseek(fd, 0, SEEK_CUR);
off_t end_position = lseek(fd, 0, SEEK_END);
if(old_position == end_position) {
/* cursor already has been at the end */
}
现在,光标在末尾,不管它是否已经在那里;要将其设置回原位,您可以在之后执行lseek(fd,old\u position,SEEK\u set)
(我省略了错误检查(返回值(off_t)-1
),为了简短起见,请记住将它们包含在实际代码中。)
另一种方法是使用另一个函数,如上文所述查询当前位置,并fstat
文件,查看st_size
字段是否等于当前位置
需要注意的是,在尝试读取文件末尾之后,为流设置文件结尾条件(
file*
,而不是int
文件描述符),光标位于末尾是不够的(也就是说,这种方法不是与feof(stream)
等效的文件描述符)。为什么要这样做?我能想到的最接近的方法是调用它两次并比较返回值if(lseek(fd,0,SEEK\u CUR)==lseek(fd,0,SEEK\u END))
,这也将文件位置设置为末尾。“当前在EOF
”有点不清楚,EOF条件是在试图读取超过最后一个字节后设置的,而不是在文件位置在末尾时设置的。@mafso:我想说,您所说的“最近”是正确答案的comapct版本。那么为什么不回答这个问题呢?给出文件大小的st_size
字段不等于SEEK_END
位置吗?(与数组一样,超过最大索引的一个就是大小)SEEK_END
设置到下一个写入位置,而不是最后一个字节。