如何使用 lseek() 确定偏移游标是否位于 EOF?

Joh*_*mBF 2 c libc eof lseek

如何lseek()仅通过使用来确定偏移光标当前是否位于 EOF ?

maf*_*fso 5

lseek返回(新)位置。如果测试后文件位置在末尾是可以接受的,则以下工作:

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 */
}
Run Code Online (Sandbox Code Playgroud)

现在,光标在末尾,无论它是否已经存在;把它放回去,你可以lseek(fd, old_position, SEEK_SET)事后做。

(off_t)-1为简洁起见,我省略了对错误(返回值)的检查,请记住将它们包含在实际代码中。)

一种替代方法,虽然使用另一个函数,但会像上面一样查询当前位置和fstat文件以查看该st_size字段是否等于当前位置。

请注意,在尝试读取文件末尾后FILE *,为流(而不是int文件描述符)设置文件结束条件,光标位于末尾是不够的(也就是说,这种方法是不是等效于feof(stream)) 的文件描述符。

  • 给出文件大小的 `st_size` 字段不会与 `SEEK_END` 位置*相等吗?(与数组一样,超过最大索引的就是大小)。`SEEK_END` 设置为下一个写入位置,而不是最后一个字节。 (2认同)