我正在逐字节读取二进制文件,我需要确定eof是否已到达。
feof()不起作用,因为“仅当对不存在的字节发出读请求时才设置eof”。因此,我可以使用自定义check_eof,如下所示:
if ( fread(&byte,sizeof(byte),1,fp) != 1) {
if(feof(fp))
return true;
}
return false;但问题是,在未到达eof的情况下,我的文件指针会向前移动一个字节。因此,一个解决方案可能是先使用ftell(),然后使用fseek()将其定位到正确的位置。
另一种解决方案可能是在某些临时存储中缓冲前面的字节。
有更好的解决方案吗?
发布于 2010-04-14 07:56:03
如果您一次读取一个字节,最常用的方法是使用fgetc
int c;
while ((c = fgetc(fp)) != EOF) {
// Do something.
}这样你就不需要处理feof了。
发布于 2010-04-14 07:27:33
我通常这样做:
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);发布于 2010-04-14 08:11:00
最好将代码组织起来,以便您尝试读取一些数据,如果由于到达文件末尾而导致读取不成功,您可以在那里处理它(例如,请参阅Kristopher Johnson's answer)。
如果您非常讨厌这样做,您可以使用ungetc将单个字符返回到流中,它将在下一个read调用中可用:
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
}https://stackoverflow.com/questions/2633863
复制相似问题