代码#1:
#include<stdio.h>
void main()
{
FILE *fp;
char ch;
fp=fopen("1.txt","r");
while((ch=fgetc(fp))!=EOF)
{
printf("%c",ch);
}
fclose(fp);
}
代码#2:
#include<stdio.h>
void main()
{
FILE *fp;
int ch;
fp=fopen("1.txt","r");
while((ch=fgetc(fp))!=EOF)
{
printf("%c",ch);
}
fclose(fp);
}
这里的CODE#1变量ch在字符数据类型下声明 CODE#2它是在整数数据类型下声明的,我的问题是两个代码的输出是如何相同的?我们如何比较字符(存储在CODE#1中的ch变量中)和整数值(由EOF返回)?整数值如何存储在ch变量(整数数据类型)中并打印在CODE#2中?
答案 0 :(得分:2)
代码#1显然是错误的,这是程序员常犯的错误。 fgetc精确返回一个int,以便可以将该值与EOF进行比较。
EOF扩展为整数常量值,它是依赖于实现的负值,但最常见的是-1。因此,当fgetc的返回值分配给char时,它会被截断为255,这是一个有效的char值。这就是fgetc返回int类型的原因,fgetc返回的值永远不应该分配给char。
如何将整数值存储在ch变量(整数数据类型)中并打印在CODE#2中?
fgetc的手册页清楚地说明了
fgetc()从流中读取下一个字符并将其作为无符号字符串转换为int,或者在文件末尾或错误时返回EOF。
因此,只要返回的值不是EOF,就可以将它强制转换为char来打印它。