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

时间:2017-04-02 18:15:27

标签: c++ c integer character file-handling

代码#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中?

1 个答案:

答案 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来打印它。

相关问题