c语言 feof()多读一次

刚接触feof,对于feof()为什么会多读一次,有些好奇,也百度了一些资料看的有些模糊,自己想了一下,不知道对不对feof()//内部可能是{判断该字符的fp->fla... 刚接触feof,对于feof()为什么会多读一次,有些好奇,也百度了一些 资料看的有些模糊,自己想了一下,不知道对不对
feof() //内部可能是
{
判断该字符的 fp->flag是否被置为EOF
是 ->return 0

判断该字符是否为结尾

指针指向下一个字符
否则
{ 指针指向下一个字符
指针指向的字符的 fp->flag是否被置为EOF}
}
还有fp->flag是什么,感觉有点模糊
希望在座的大佬能指出我的不足之处,万分感谢
{
判断该字符的 fp->flag是否被置为EOF
是 ->return 0

判断该字符是否为结尾

指针指向下一个字符
否则
{ 指针指向下一个字符
指针指向的字符的 fp->flag是否被置为EOF}
}
还有fp->flag是什么,感觉有点模糊
希望在座的大佬能指出我的不足之处,万分感谢
展开
 我来答
风若远去何人留
2018-01-03 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450116
专业C/C++软件开发

向TA提问 私信TA
展开全部

fp的flag就是一个标志位.

在判断feof的时候只是单纯的返回这个标志位的值,并不会出现读操作.

int feof(FILE *fp){ return fp->flag;}

而fp->flag赋值是在其他读操作时赋值的, 包括fgetc, fread, fscanf等等.

所以 只要代码写的正确, 是不会造成多读的.

多读一次 一般都是代码写的不对.

比如

while(!feof(fp))
{
    putchar(fgetc(fp));
}

这样就会导致多读一次.因为, 最后一次 fgetc出错, 才赋值flag为1, 这一次读的结果就是无效的.

可是一样执行了putchar, 就导致了多一次. 

如果改成

while(1)
{
    int c=fgetc(fp);
    if(feof(fp)) break;
    putchar(c);
}

就没问题了.

追问
while(!feof(fp))
{
putchar(fgetc(fp));
}
fp->flag赋值是在其他读操作时赋值的,所以第一次feof(fp)还没有赋值,所以while会多一次吗。
还有
如果fscanf()和 fprintf(()在一个循环里一起用,会导致上一个字符被输入,下一个字符被输出 ,指针跳到下下个字符吗。
追答
两个都对,就是这样的
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式