首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C文件处理中的feof()

C文件处理中的feof()
EN

Stack Overflow用户
提问于 2010-04-14 07:20:36
回答 5查看 7.1K关注 0票数 3

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

feof()不起作用,因为“仅当对不存在的字节发出读请求时才设置eof”。因此,我可以使用自定义check_eof,如下所示:

代码语言:javascript
复制
if ( fread(&byte,sizeof(byte),1,fp) != 1) {
    if(feof(fp))
    return true;
}
return false;

但问题是,在未到达eof的情况下,我的文件指针会向前移动一个字节。因此,一个解决方案可能是先使用ftell(),然后使用fseek()将其定位到正确的位置。

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

有更好的解决方案吗?

EN

回答 5

Stack Overflow用户

发布于 2010-04-14 07:56:03

如果您一次读取一个字节,最常用的方法是使用fgetc

代码语言:javascript
复制
int c;
while ((c = fgetc(fp)) != EOF) {
   // Do something.
}

这样你就不需要处理feof了。

票数 6
EN

Stack Overflow用户

发布于 2010-04-14 07:27:33

我通常这样做:

代码语言:javascript
复制
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);
票数 3
EN

Stack Overflow用户

发布于 2010-04-14 08:11:00

最好将代码组织起来,以便您尝试读取一些数据,如果由于到达文件末尾而导致读取不成功,您可以在那里处理它(例如,请参阅Kristopher Johnson's answer)。

如果您非常讨厌这样做,您可以使用ungetc将单个字符返回到流中,它将在下一个read调用中可用:

代码语言:javascript
复制
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

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2633863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档