您的位置:首页 > 其它

fgetc函数的返回值为什么是 int 类型

2017-02-15 11:23 190 查看

最近从中文的文本中用 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)比较时相等,误判为已经读到文件末尾。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  fgetc
相关文章推荐