C语言中fgetc()函数的返回值为什么是int类型?

原文链接大力挥拳用户所著

最近从中文的文本中用 fgetc()函数读取数据时,数据读到一部分程序提早跳出。
源程序中fgetc使用方法如下

#include<stdio.h>
#include<stdlib.h>
 
void main()
{
 
	FILE *fp = fopen("1.txt", "r");
 
	if (NULL == fp)
	{
		return;
	}
 
 
	char ch;
	
	while ( ( ch= fgetc(fp) ) != EOF)  //不断读取文件知道结束
	{
		putchar(ch);
	}
 
	system("pause");
 
}

问题所在 fgetc 使用错误,正确使用方法 上述代码中的 ch 类型应该定义成 int

	int ch;  
	
	while ( ( ch= fgetc(fp) ) != EOF)  //不断读取文件知道结束
	{
		putchar(ch); //打印
	}

*分析 : fgetc 格式为 int fgetc(FILE stream);这个函数的返回值,是返回所读取的一个字节。如果读到文件末尾或者读取出错时返回EOF 。当读取字符时,返回值为 0x00 – 0xff 之间。计算机系统中,数值一律用补码来表示和存储。
当ch 类型为char 时(错误使用方式)
1.fgetc读到字符0xFF时转换成32位为0x000000FF返回 ,代码中用 char类型的ch接收,0x000000FF被截断,ch等于0xFF。
2.EOF值为-1,即0xFFFFFFFF,与值为 0xFF(即 char 类型-1的表示方式)的ch比较时,ch转换成32位后为0xFFFFFFFF(32系统中int 类型 -1的表示方式),比较结果为相等,导致判断失误,程序提早退出。
当ch 为 int 类型 (正确使用方式)
读到 字符 0xFF函数返回为0x000000FF,读到末尾返回EOF即0xFFFFFFFF,不会导致判断出错。

总结

出错原因在于:变量ch 为char类型读到字符0xFF与EOF(-1)比较时相等,误判为已经读到文件末尾。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值