免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: lixforalpha
打印 上一主题 下一主题

[C] c语言 关于文件的两个问题 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2003-12-24 12:14 |显示全部楼层

c语言 关于文件的两个问题

FF 就是 EOF
你不该把它写回文件中的.

论坛徽章:
0
2 [报告]
发表于 2003-12-25 20:37 |显示全部楼层

c语言 关于文件的两个问题

[quote]原帖由 "lixforalpha"]四个平台下fputc1.dat总是会比fputc.dat文件多出一字节,[/quote 发表:


多出一个字节是因为你的程序写得不对。如果你一直用getc,就不要用 feof来判断是否结束,应该以

fegtc () != EOF 来判断。

论坛徽章:
0
3 [报告]
发表于 2003-12-26 10:17 |显示全部楼层

c语言 关于文件的两个问题

[quote]原帖由 "aero"]楼上的,这个是为什么呢?详细解释一下吧。[/quote 发表:


比方说,你的文件长为10字节,然后你进行10次

c=fgetc(fp);

则此时已将文件全部读出,但系统并不知道这一点,只有再读一次才能发现。此时 feof (fp) 返回的是 false,也就是未到文件末尾。所以此时如果再次getc,得到的是 -1,也就是 EOF

假定文件长度为10:

rep 10  c=fgetc (fp); // 到尾了
while (!feof (fp))  // 条件为真啊!
{
     c = fgetc (fp); // 得到的是 -1,也就是 EOF
     fputc (c, fp); // 把 EOF 写到文件里头了!!
}

上面的 while 循环在第二次执行的时候停止,所以总是多出一个 EOF

论坛徽章:
0
4 [报告]
发表于 2003-12-27 10:59 |显示全部楼层

c语言 关于文件的两个问题

[quote]原帖由 "蓝色键盘" 发表:
要使每个人都像lixforalpha就好了,每一步贴上了插图

我说说自己的看法

对于文件来说
从存储形式上来说,我们区分为ASCII码文件和二进制文件

谢看看这二者的区别:
ASCII码文件的每1个字节存储1个字符,

论坛徽章:
0
5 [报告]
发表于 2003-12-27 19:55 |显示全部楼层

c语言 关于文件的两个问题

原帖由 "fieryfox" 发表:
经典错误,不过还没改对:while((c=fgetc(fp))!=EOF) fputc(c,fp1); 的c必须是int,否则结果就可能跟编译器实现相关了。因为不同的编译器默认的char是有符号的还是无符号的是不一样的,这也是因为标准没有规定。

..........


这的确是个经典错误。

c 是个 int, 前面 flw 版主已经指出过这一点,请大家看仔细。

如果把 c 定义为 char,则读文件有可能意外终止,如果其中包含 0xff 字符。
如果把 c 定义为 uchar,则陷入死循环。编译器应该有警告。
如果把 c 定义为 int 则一切正常。

kernighan 说过,编程应该避免"surprise"。从字面上看,fgetc 返回的是 char,实际上却是个 int,这就是一个 "surprise",从而成为 fgetc 的一块暗礁。

论坛徽章:
0
6 [报告]
发表于 2003-12-29 19:18 |显示全部楼层

c语言 关于文件的两个问题

[quote]原帖由 "蓝色键盘" 发表:
如果调用者判断,那么系统(stdio.h)提供了一个宏EOF(-1)来判断文件是否结束,然而这种机制只适合ASCII文件,对于二进制使用这个来判断可能导致失败。


unix下处理都是二进制
谁有时间的话,可以到windows或
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP