返回信息流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...
那么微软的记事本是以什么方式来解读文件的?
这是一条镜像帖。来源:北邮人论坛 / soft-design / #22510同步于 2007/11/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
请教关于c标准库里的putc(int c, FILE *fp)函数
yejiji
2007/11/27镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
第一个问题,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)。
在网上搜呀搜,就是搜不到到ascii详解
【 在 Quake 的大作中提到: 】
: -___-!!
: 这个问题非常无语
: 1、看函数说明,linux下可以man
: ...................
那个到应该不是什么兼容性问题
int可以确保你直接操作ascii码
至于为什么不用更短的关键字,那是因为char可以隐式转换为int
C没有函数重载,不过对于putc,由于隐式转换的存在,直接传char进去也是没问题的
这样就不用分开写putc_by_int和putc_by_char两个函数了
【 在 WangZhaogang 的大作中提到: 】
: 第一个问题,fputc确实是只写int的第一个字节,至于为什么设定成int,可能是为了之前的字长比较短的系统兼容。我记得在Turbo C下,int是2字节的(但这里只用一个字节,所以我也不知道为什么设成int的)。
【 在 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);
之后打开文件显示的是中文乱码。
记事本会“猜测”你的内码格式,结果它猜错了。它以为这个文件是Unicode的,就按Unicode打开了。你可以启动一个记事本,然后在文件菜单里选择“打开...”。弹出的对话框下面的“编码”里的格式应该是ANSI,一旦你选择某个文件,“编码”就会变,你选择这个文件之后,“编码”就变成了Unicode,我估计是它判断你这个文件是Unicode的,但它错了。这时如果你直接点,打开,就会是中文乱码,如果你手动把编码格式改成Ansi,则应该是正常的。至于为什么它会这么判断,我了不知道了。你可以BAIDU一下
虽然没有去百度,但我赞同这个解释。
【 在 WangZhaogang 的大作中提到: 】
: 记事本会“猜测”你的内码格式,结果它猜错了。它以为这个文件是Unicode的,就按Unicode打开了。你可以启动一个记事本,然后在文件菜单里选择“打开...”。弹出的对话框下面的“编码”里的格式应该是ANSI,一旦你选择某个文件,“编码”就会变,你选择这个文件之后,“编码”就变成了Unicode,我估计是它判断你这个文件是Unicode的,但它错了。这时如果你直接点,打开,就会是中文乱码,如果你手动把编码格式改成Ansi,则应该是正常的。至于为什么它会这么判断,我了不知道了。你可以BAIDU一下
【 在 WangZhaogang 的大作中提到: 】
: 记事本会“猜测”你的内码格式,结果它猜错了。它以为这个文件是Unicode的,就按Unicode打开了。你可以启动一个记事本,然后在文件菜单里选择“打开...”。弹出的对话框下面的“编码”里的格式应该是ANSI,一旦你选择某个文件,“编码”就会变,你选择这个文件之后,“编码”就变成了Unicode,我估计是它判断你这个文件是Unicode的,但它错了。这时如果你直接点,打开,就会是中文乱码,如果你手动把编码格式改成Ansi,则应该是正常的。至于为什么它会这么判断,我了不知道了。你可以BAIDU一下
应该没有猜错,就是ANSI