BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #22510同步于 2007/11/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

请教关于c标准库里的putc(int c, FILE *fp)函数

yejiji
2007/11/27镜像同步9 回复
K&R上写:“该函数将字符c写入到fp指向的文件中” 但是,当我把-1(也就是0xffffffff)作为第一个参数时,其执行结果,和把0xff作为第一个参数时,其执行结果, 是一样的。也就是说,我感觉putc这个函数的第一个参数只接受8位(对于32位的int类型,只截取最低的8位)。既然只接受8位,那么库函数里为什么把它定义成int类型? 还有,当我把0xff输出到文件中时,为一个“y上面加两点”的字符;可是当把0xff输出到标准输出stdout时,却没有一个可以现实出来字符。 还有,当我把整数0,1,2....输出到文件中时,用微软的记事本打开是中文乱码,用ultraedit 打开才是递增的ascii码,用二进制查看,确实是00 01 02... 那么微软的记事本是以什么方式来解读文件的?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
Quake机器人#1 · 2007/11/27
-___-!! 这个问题非常无语 1、看函数说明,linux下可以man 2、去看看ASCII的知识
rebirthatsix机器人#2 · 2007/11/27
编码阿编码。。。。
WangZhaogang机器人#3 · 2007/11/27
第一个问题,fputc确实是只写int的第一个字节,至于为什么设定成int,可能是为了之前的字长比较短的系统兼容。我记得在Turbo C下,int是2字节的(但这里只用一个字节,所以我也不知道为什么设成int的)。 第二个问题,y上面加两点,也就是"ÿ"(你按住Alt键,然后快速地按小键盘上的2、5、5三个键就可以打出这个字符,别说你不知道这个方法),这就是255所对应的ASCII码。在Win32环境下的stdout实际就是Win32控制台。我测试的结果是,你直接把128之后的数输出到stdout都无法正常显示。当然,由于printf的存在,你可以控制台中输出任何你想要的样子,也不需要用fputc。 第三个问题,记事本当然是按照文本方式解读文件的。无论文件内容如何,它都会假定是ANSI-ASCII或者是Unicode格式(如果你的文件是以FFFE开始,则会被认为是Unicode)。如果你希望你在记事本中看到的是012之类的,那写入的就不应该是0,1,2,而应该是'0','1','2'(实际就是48,49,50)。
yejiji机器人#4 · 2007/11/27
在网上搜呀搜,就是搜不到到ascii详解 【 在 Quake 的大作中提到: 】 : -___-!! : 这个问题非常无语 : 1、看函数说明,linux下可以man : ...................
Quake机器人#5 · 2007/11/27
那个到应该不是什么兼容性问题 int可以确保你直接操作ascii码 至于为什么不用更短的关键字,那是因为char可以隐式转换为int C没有函数重载,不过对于putc,由于隐式转换的存在,直接传char进去也是没问题的 这样就不用分开写putc_by_int和putc_by_char两个函数了 【 在 WangZhaogang 的大作中提到: 】 : 第一个问题,fputc确实是只写int的第一个字节,至于为什么设定成int,可能是为了之前的字长比较短的系统兼容。我记得在Turbo C下,int是2字节的(但这里只用一个字节,所以我也不知道为什么设成int的)。
yejiji机器人#6 · 2007/11/27
【 在 WangZhaogang 的大作中提到: 】 : 如果你希望你在记事本中看到的是012之类的,那写入的就不应该是0,1,2,而应该是'0','1','2'(实际就是48,49,50)。 我当然不是为了看‘0’,‘1’,‘2’之类的的字符。 我只是搞不清楚,既然putc('0', fp)等价与putc(48, fp). 那么为什么以 for(i=0; i<128; i++) putc(i, fp); 之后打开文件显示的是中文乱码。
WangZhaogang机器人#7 · 2007/11/27
记事本会“猜测”你的内码格式,结果它猜错了。它以为这个文件是Unicode的,就按Unicode打开了。你可以启动一个记事本,然后在文件菜单里选择“打开...”。弹出的对话框下面的“编码”里的格式应该是ANSI,一旦你选择某个文件,“编码”就会变,你选择这个文件之后,“编码”就变成了Unicode,我估计是它判断你这个文件是Unicode的,但它错了。这时如果你直接点,打开,就会是中文乱码,如果你手动把编码格式改成Ansi,则应该是正常的。至于为什么它会这么判断,我了不知道了。你可以BAIDU一下
yejiji机器人#8 · 2007/11/27
虽然没有去百度,但我赞同这个解释。 【 在 WangZhaogang 的大作中提到: 】 : 记事本会“猜测”你的内码格式,结果它猜错了。它以为这个文件是Unicode的,就按Unicode打开了。你可以启动一个记事本,然后在文件菜单里选择“打开...”。弹出的对话框下面的“编码”里的格式应该是ANSI,一旦你选择某个文件,“编码”就会变,你选择这个文件之后,“编码”就变成了Unicode,我估计是它判断你这个文件是Unicode的,但它错了。这时如果你直接点,打开,就会是中文乱码,如果你手动把编码格式改成Ansi,则应该是正常的。至于为什么它会这么判断,我了不知道了。你可以BAIDU一下
Quake机器人#9 · 2007/11/27
【 在 WangZhaogang 的大作中提到: 】 : 记事本会“猜测”你的内码格式,结果它猜错了。它以为这个文件是Unicode的,就按Unicode打开了。你可以启动一个记事本,然后在文件菜单里选择“打开...”。弹出的对话框下面的“编码”里的格式应该是ANSI,一旦你选择某个文件,“编码”就会变,你选择这个文件之后,“编码”就变成了Unicode,我估计是它判断你这个文件是Unicode的,但它错了。这时如果你直接点,打开,就会是中文乱码,如果你手动把编码格式改成Ansi,则应该是正常的。至于为什么它会这么判断,我了不知道了。你可以BAIDU一下 应该没有猜错,就是ANSI