在C文件处理中的feof()

时间:2010-04-13 23:20:36

标签: c file-handling feof

我正在逐字节读取二进制文件,我需要确定是否已达到eof。

feof()不起作用“只有在对不存在的字节进行读取请求时才设置eof”。所以,我可以使用我的自定义check_eof:

if ( fread(&byte,sizeof(byte),1,fp) != 1) {
    if(feof(fp))
    return true;
}
return false;

但问题是,如果没有达到eof,我的文件指针会向前移动一个字节。 因此,解决方案可能是使用ftell()然后使用fseek()来使其更正位置。

另一个解决方案可能是在一些临时存储中缓冲前面的字节。

有更好的解决方案吗?

5 个答案:

答案 0 :(得分:6)

如果您一次只读一个字节,那么惯用的方法就是使用fgetc

int c;
while ((c = fgetc(fp)) != EOF) {
   // Do something.
}

然后你不需要处理feof

答案 1 :(得分:3)

我通常做这样的事情:

int get_next_char(FILE* fp, char *ch)
{
    return fread(ch, sizeof(char),1, fp) == 1;
}

// main loop
char ch;
while (get_next_char(fp, &ch))
    process_char(ch);

if (!feof(fp))
    handle_unexpected_input_error(fp);

答案 2 :(得分:2)

最好构建代码,以便尝试读取某些数据,如果由于到达文件结尾而读取不成功,则在那里处理它(即参见Kristopher Johnson's answer)。< / p>

如果您非常讨厌这个,可以使用ungetc将单个字符返回到流中,并在下次阅读时显示:

int c = fgetc(fp);
if (c == EOF)
{
    // handle eof / error
}
else
{
    ungetc(c, fp);

    // the next read call is guaranteed to return at least one byte

}

答案 3 :(得分:0)

我不清楚,但是如果你在读取字节之前有兴趣知道如果已达到EOF,请将你的feof()测试放在fread()之前而不是之后。
实际上,如果我读得正确,你甚至不想这样做:

return feof(fp) ? true : false;

答案 4 :(得分:0)

我建议使用:

fseek(myFile, 0, SEEK_END);
fileLen = ftell(myFile);
fseek(myfile, 0, SEEK_SET);

首次打开文件时确定长度。然后设置你的读循环从不读取结束。您可以使用ftell找出自己的位置,并与fileLen进行比较,以确定您还需要进一步了解。