C 编程中的文件处理:以下两段代码有什么区别?

File handling in C programming: What is the difference between below two codes?

代码 #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);

}

在代码#1 中,变量 ch 在字符数据类型下声明,而在 CODE #2 它是在整数数据类型下声明的,我的问题是这两个代码的输出怎么会相同?我们如何比较字符(存储在 CODE #1 的 ch 变量中)和整数值(由 EOF 返回)?整数值如何存储在 ch 变量(整数数据类型)中并打印在 CODE #2 中?

CODE#1明显错误,是程序员常犯的错误。 fgetc returns 一个 int 精确地以便该值可以与 EOF 进行比较。

EOF 扩展为整数常量值,它是一个依赖于实现的负值,但最常见的是 -1。因此,当 fgetc 的 return 值分配给 char 时,它会被截断为 255,这是一个有效的 char 值。这就是为什么 fgetc 具有 return 类型的 int 和值 return 从 fgetc 不应该分配给 char 的原因。

整数值如何存储在 ch 变量(整数数据类型)中并在代码 #2 中打印?

fgetc 的手册页明确指出

fgetc() 从流中读取下一个字符,并 return 将其作为无符号字符转换为 int,或文件末尾的 EOF 或错误。

因此,只要 returned 值不是 EOF,将其类型转换为 char 即可打印它。