fgetc返回乱码:ASCII文件读取输出程序异常排查求助
问题分析与修复方案
嘿,我一眼就瞅出问题所在了——你的循环条件里藏着个优先级的坑!
问题根源
C语言中,!=运算符的优先级比=更高,所以你写的:
while(c = fgetc(fptr) != EOF)
实际上会被编译器解析成:
while(c = (fgetc(fptr) != EOF))
这意味着每次调用fgetc读取字符后,程序会先判断该字符是否不等于EOF,得到一个布尔结果(1表示真,0表示假),然后把这个布尔值赋值给变量c。你最终输出的是ASCII值为1或0的控制字符,这些字符在终端里显示出来就是你看到的乱码。
修复方法
给赋值语句加上括号,强制让赋值操作先执行,再进行判断:
while( (c = fgetc(fptr)) != EOF )
这样程序会先把fgetc读取到的字符(或EOF)赋值给c,再判断c是否不等于EOF,逻辑就完全正确了。
额外提醒
值得肯定的是,你把c声明为int类型是正确的——因为EOF是一个int类型的特殊值(通常为-1),如果用char存储的话,可能会因为符号位的问题导致无法正确判断EOF,这部分你做对了~
内容的提问来源于stack exchange,提问作者akatz
相关产品推荐
相关产品推荐

