代码片段if (ungetc(getc(in), in) != EOF)是否等价于判断文件未到末尾?
关于
if (ungetc(getc(in), in) != EOF)的功能解析 先拆解涉及的两个标准库函数:
getc(in):从文件指针in指向的输入流读取一个字符,成功则返回该字符(以unsigned char转换为int的形式);若到达文件末尾或读取出错,返回EOF。ungetc(c, in):将字符c推送回输入流,使得后续的读取操作能再次获取该字符;成功则返回c,失败则返回EOF。
再分析这条语句的逻辑:
- 先执行
getc(in):- 如果返回
EOF(要么到了文件尾,要么读取出错),此时调用ungetc(EOF, in)属于未定义行为,但多数实现会让ungetc返回EOF,条件!= EOF不成立。 - 如果成功读到一个字符,再调用
ungetc把这个字符推回流中(相当于“反悔”这次读取,让后续操作还能读到它),此时ungetc返回读到的字符(非EOF),条件成立。
- 如果返回
所以这条语句在大多数场景下,效果等价于判断文件尚未到达末尾,但存在两个特殊情况:
- 当读取操作发生错误(而非到达文件尾)时,
getc返回EOF,条件也会不成立,但这不是文件尾的情况。 - 若
ungetc调用失败(比如输入流不支持回退,或已经达到回退的最大次数),即使getc成功读到字符,ungetc也会返回EOF,导致条件不成立,但这种情况非常罕见。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

