C 成功调用fseek()函数将清除流的文件结束指示符

C 成功调用fseek()函数将清除流的文件结束指示符,c,file,pointers,stdio,fseek,C,File,Pointers,Stdio,Fseek,标准c库函数fseek的手册中说:“成功调用fseek()函数将清除流的文件结束指示器。” 对我来说,这听起来像是在说如果EOF在2并且我调用fseek()将指针指向4,那么应该可以工作,EOF现在将指向5。但是当我检验这个假设时,指针并没有超出当前的EOF(在上面的例子中是2),因此我对这条线的理解是错误的。这句话是什么意思?谢谢 您必须记住,EOF标志只有在您实际尝试从文件末尾以外的位置读取时才会设置 当fseek清除该标志时,即使您试图超出文件末尾,它也会执行此操作。它之所以有效,是因为下

标准c库函数fseek的手册中说:“成功调用
fseek()
函数将清除流的文件结束指示器。”


对我来说,这听起来像是在说如果
EOF在2
并且我调用
fseek()
将指针指向4,那么应该可以工作,
EOF
现在将指向5。但是当我检验这个假设时,指针并没有超出当前的
EOF
(在上面的例子中是2),因此我对这条线的理解是错误的。这句话是什么意思?谢谢

您必须记住,
EOF
标志只有在您实际尝试从文件末尾以外的位置读取时才会设置

fseek
清除该标志时,即使您试图超出文件末尾,它也会执行此操作。它之所以有效,是因为下次阅读时会再次设置该标志


这就是为什么像
while(!feof(…)
这样的循环是一个坏主意,因为这些循环会一次循环到多个循环,而不会检测到文件的实际结束状态。

您必须记住,
EOF
标志是在您实际尝试从文件结束之外读取时才设置的

fseek
清除该标志时,即使您试图超出文件末尾,它也会执行此操作。它之所以有效,是因为下次阅读时会再次设置该标志


这就是为什么像(!feof(…)这样的循环是一个坏主意,因为它们会一次循环到多个循环,而不会检测到文件的实际结束状态。

这意味着,如果您以前点击过EOF,然后在文件中找到一个有效位置,那么EOF标志将不再设置。这是正确的。谢谢这意味着,如果您以前点击过EOF,然后在文件中找到一个有效位置,那么EOF标志将不再设置。这是正确的。谢谢谢谢我应该记得EOF是一个标志,而不是文件中的一个位置。现在有道理了,谢谢!我应该记得EOF是一个标志,而不是文件中的一个位置。现在它有意义了。