注意:
EOF是fgetc函数的返回值,并不是文件中存在EOF)
int fputc(int ch,FILE *stream); //向文件中写字符
int fgetc(FILE *stream); //从文件中读字符
注意:
1)fputc()函数的参数是 int ch,但是传入的时候需直接传入字符;
2)fgetc的返回值是int ,一定不要弄错了。
如果换成char会容易误判:
首先明白三点:
i)32位系统中 EOF = 0xff ff ff ff;
ii)fgetc的返回值类型是int,如果用char作为返回值的话,相当于进行了一步类型转换;
iii)fgetc参数的范围是0x00 至 0xff,即是个unsigned char
使用char类型返回 :(错误)
先扩充至32位int 0x00 00 00 ff 返回 ;转char 后只剩一字节,变成 0xff;
char与EOF这个int 比较时,会转换为0xff ff ff ff,这样就和EOF相等,造成误判退出;
使用int类型返回:(正确)
先扩充至32位int 0x00 00 00 ff 返回 ;转int后正常输出,变成 0x00 00 00 ff;
int与EOF这个int 比较时,0x00 00 00 ff 不等于 0xff ff ff ff,不会造成误判;
ASCII码的数据类型是uchar.
char ch_put = 'a';//输入char类型
fputc(ch,fp);
int ch_get; //这个地方一定要是int才行!!!!!
while ( ( ch= fgetc(fp) ) != EOF) //不断读取文件知道结束
{
putchar(ch);
}
详细解释:参考fgetc函数踩过的坑_fireflylane的博客-CSDN博客_fgetc
附录:数据类型转换顺序
double ←—— float 高
↑
long
↑
unsigned
↑
int ←—— char,short 低