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)比较时相等,误判为已经读到文件末尾。
相关文章推荐
- C语言中fgetc函数返回值为什么是int?
- Swift 如何将数字型字符串转换成String类型 (toInt()方法) 及返回值未解包的原因
- groovy string类型转换成int(来自csdn)不要问为什么系列6
- 为什么16位系统下,int类型能够表示的范围是:-32768到32767,而不是从-32767到32767呢?
- Hibernate Tip: 为什么要把变量类型设置为Long, Integer,而不是long, int
- 既然float不能表示所有的int_那为什么在类型转换时C++将int转换成float?
- Java中字节流和字符流的read()方法为什么返回的值是int类型
- java 编程下 IO 中的输入流的 read() 方法返回值为什么是 int 值
- JDK的OutputStream为什么方法write(int b)的入参类型是int呢?
- JAVA为什么有时候除法计算结果本来应该是小数。但是得到整数int类型
- c#中的类型转换,int.parse("ab")为什么会出错
- c语言int类型的范围为什么是-2^32到(2^31)-1
- java.io.FileInputStream.read()的返回值类型为什么是int而不是byte
- [php] pdo 查询 mysql 返回值 int 转 string 类型的问题
- 为什么数据库表的int类型字段映射到实体类中要使用Integer类型,而不是int类型?
- 为什么要用大写的那些类型修饰符?如INT与int
- int数据类型是几位的?为什么负数通过计算器和通过代码转化为二进制的结果不同?
- 为什么int类型(16位)的下溢下限为-32768而上溢上限却是32767
- 为什么int类型字段在mysql中默认int(11) 无符号默认int(10)?
- 为什么Int类型的取值范围是2的31次方减1