我正在逐字节读取二进制文件,我需要确定是否已达到eof。
feof()不起作用“只有在对不存在的字节进行读取请求时才设置eof”。所以,我可以使用我的自定义check_eof:
if ( fread(&byte,sizeof(byte),1,fp) != 1) {
if(feof(fp))
return true;
}
return false;
但问题是,如果没有达到eof,我的文件指针会向前移动一个字节。
因此,解决方案可能是使用ftell()
然后使用fseek()
来使其更正位置。
另一个解决方案可能是在一些临时存储中缓冲前面的字节。
有更好的解决方案吗?
答案 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进行比较,以确定您还需要进一步了解。