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 即可打印它。
代码 #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 即可打印它。