Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用lseek()确定偏移光标是否位于EOF?_C_Eof_Libc_Lseek - Fatal编程技术网

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
设置到下一个写入位置,而不是最后一个字节。