免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
21 [报告]
发表于 2003-12-26 00:12 |只看该作者

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

原帖由 "dadaball" 发表:
Re: 你说的情况我在模拟时没发生过
你的原始代码
#include "stdio.h"
int test(void)
{int n;
char c;
FILE *fp;
if((fp=fopen("fputc.dat","wb")==NULL) return 1;
for(n=0;n<10;n++)
{c=getchar();
fputc(c,fp);
}
fclose(fp);
retu..........

能把使用的平台和代码贴出来吗?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
22 [报告]
发表于 2003-12-26 09:29 |只看该作者

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

[quote]原帖由 "lixforalpha"]while(fgetc(fp)!=EOF) fputc(fgetc(fp),fp1); [/quote 发表:


这个当然有问题了。fgetc每运行一次就把文件的指针向前移一个,你这么写,每次循环都得运行两次,所以就是跳着取了一半的字符。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
23 [报告]
发表于 2003-12-26 09:32 |只看该作者

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

原帖由 "lixforalpha" 发表:

能把使用的平台和代码贴出来吗?


用这个代码是没有问题的,这个用for语句限定了循环次数。关键是用while循环会有问题。

论坛徽章:
0
24 [报告]
发表于 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

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
25 [报告]
发表于 2003-12-26 11:01 |只看该作者

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

谢谢楼上的,呵呵自己也刚刚试验出来。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
26 [报告]
发表于 2003-12-26 11:05 |只看该作者

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

明白了,就是说,getc改变的是文件的当前指针而不改变文件的状态,只有读不出了才改变文件的状态。而feof测试的是文件的状态。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
27 [报告]
发表于 2003-12-26 11:06 |只看该作者

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

明白了,就是说,getc改变的是文件的当前指针而不改变文件的状态,只有读不出了才改变文件的状态。而feof测试的是文件的状态。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
28 [报告]
发表于 2003-12-26 13:08 |只看该作者

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

已收入 FAQ-6-2、FAQ-4-4

论坛徽章:
0
29 [报告]
发表于 2003-12-26 13:17 |只看该作者

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

我来说一句吧,,别用feof()函数就不会出现最后一个多余的字符了,,,

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
30 [报告]
发表于 2003-12-26 13:43 |只看该作者

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

[quote]原帖由 "flw"]已收入 FAQ-6-2、FAQ-4-4。[/quote 发表:


老大真敬业。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP