| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1300 人关注过本帖
标题:经常被引用的最简单的C程序,但几乎所有的C教材都错了
只看楼主 加入收藏
macrohard
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2006-4-3
收藏
 问题点数:0 回复次数:11 
经常被引用的最简单的C程序,但几乎所有的C教材都错了
最简单的读一个文件,然后写出到另一个文件,很多C教材都有这个例子,确实看起来太简单,
但只要你编译并运行,用二进制编辑器仔细查看结果,
你就会百思不得其解,
很多对库函数的说明会让你越看越糊涂。



FILE *fp1, *fp2;
char c;
fp1 = fopen("Input.bin", "rb");
fp2 = fopen("Output.bin", "wb");
while(!feof(fp1)) {
c = fgetc(fp1);
fputc(c, fp2);
}
fclose(fp1);
fclose(fp2);
搜索更多相关主题的帖子: 教材 二进制 bin fgetc 
2006-04-03 13:37
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
第一次看见这个错误是在谭浩强的那本C程序设计之类的书上,好像比楼主写的还更加精练一点,同样的毛病。估计大家写书的时候从来不调试一下程序,只管抄了。
中间那个while 应该改成:
while((c = fgetc(fp1)) != EOF)
fputc(c, fp2);

http://myajax95./
2006-04-03 13:55
本人已死
Rank: 1
等 级:新手上路
威 望:1
帖 子:183
专家分:0
注 册:2005-9-20
收藏
得分:0 

最后多的一个字符是把"EOF"输出了


爸爸告诉我:女人喜欢有钱的男人;妈妈告诉我:女人喜欢有貌的男人。我翻翻钱包,又照照镜子,然后我哭了
2006-04-03 14:05
macrohard
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2006-4-3
收藏
得分:0 
2楼同学的修改也有问题啊,
如果输入文件中有-1的值,就会被当做EOF,
造成文件截断,

其实 WindRiver的 VxWorks的Help里也注意到这个问题,
但对fgetc的解释会让人更迷惑。
2006-04-03 14:40
cao651279716
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-4-3
收藏
得分:0 
我也是个粗的,可不可以这样试试!!!
FILE *fp1, *fp2;
char c;
fp1 = fopen("Input.bin", "rb");
fp2 = fopen("Output.bin", "wb");
while(!feof(fp1))
{
fscanf(fp1,"%c"&c);

fprintf(fp2,"%c" c);
}
fclose(fp1);
fclose(fp2);
2006-04-03 16:36
cao651279716
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-4-3
收藏
得分:0 

另外在打下文件时最好做一个判断,看看文件打开是不是出错,保持这个好习惯是有用处的.

2006-04-03 16:38
macrohard
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2006-4-3
收藏
得分:0 
谢谢楼上的提醒,是为了简化,才没有加fopen==NULL判断的
2006-04-03 17:34
Cihor
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2006-3-27
收藏
得分:0 

高教的二级教材中讲到了这个问题,可能是人们都不太注意吧
“注意:无论调用哪种函数读文件时,最好要先执行一次读操作,然后再支判断文件是否结束。”P220页
所以我的理解正确的形式应是这样:
ch=getc(fpIn);
while(!feof)
{ putc(ch,fpOt);
ch=getc(fpIn);

}
经过运行,发现可以消除多复制的0xff


好好学习,天天向上
2006-04-03 23:33
macrohard
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2006-4-3
收藏
得分:0 

谢谢楼上的解答,
我觉得这个问题的根源是feof 和fgetc这两个库函数的文件偏移指针的设计有问题,没有按统一的标准进行规划。

2006-04-04 09:38
cordier
Rank: 2
等 级:论坛游民
威 望:1
帖 子:449
专家分:14
注 册:2006-2-9
收藏
得分:0 

我觉得最主要的是,EOF的值为-1,如果文件中有一个数刚好是255,此时,如果用!=EOF,就会出现结束。
这个问题通过函数feof()可以得到解决。


2006-04-04 10:43
快速回复:经常被引用的最简单的C程序,但几乎所有的C教材都错了
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017651 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved