标题:一个用文件函数写入数据的错误
只看楼主
han2y
Rank: 1
来 自:山东德州
等 级:新手上路
帖 子:175
专家分:0
注 册:2006-5-4
结帖率:100%
 问题点数:0 回复次数:16 
一个用文件函数写入数据的错误

题目是:有3名学生,从键盘上输入学生的学号,姓名,及3门课的成绩,并计算出平均成绩,然后将学生的记录和计算出的平均成绩存放在磁盘文件中:(代码如下)
#include <stdio.h>
main()
{
struct student
{
int num;
char name[10];
int score[3];
float aver;
}stu[3];
int i,j,aver;
FILE *fp;
aver=0;
if((fp=fopen("c:\\student.txt","wb"))==NULL)
{
printf("cannot open file.");
exit(0);
}
for(i=0;i<3;i++)
{
printf("enter %d num and name:",i+1);
scanf("%d%s",&stu[i].num,stu[i].name);
printf("enter score:");
for(j=0;j<3;j++)
{
scanf("%d",&stu[i].score[j]);
aver+=stu[i].score[j];
}
aver=aver/3;
stu[i].aver=aver;
aver=0;

}
for(i=0;i<3;i++)
printf("output:%3d%5s%4d%4d%6d%-5.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1], stu[i].score[2],stu[i].aver);
for(i=0;i<3;i++)
{
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
printf("%dfile write error.",i+1);
}
fclose(fp);

}

运行此代码时能够在屏幕上显示正确数据,可是打开文件时却不正确,不知问题出在哪里?请指点……谢谢!

[此贴子已经被作者于2006-6-20 9:45:48编辑过]

搜索更多相关主题的帖子: 函数 文件 数据 student 
2006-06-20 09:41
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
得分:0 
运行此代码时能够在屏幕上显示正确数据,可是打开文件时却不正确,不知问题出在哪里?
[答]你凭什么说它不正确?也许正确着呢!

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-20 09:57
han2y
Rank: 1
来 自:山东德州
等 级:新手上路
帖 子:175
专家分:0
注 册:2006-5-4
得分:0 
出现了乱符

2006-06-20 09:58
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
得分:0 
回复:(han2y)出现了乱符
以下是引用han2y在2006-6-20 9:58:58的发言:
出现了乱符

乱符其实不乱,因为你
1。设定的是“wb”二进制文件(这不是主要的)
2。存盘时用了fwrite()写数据块函数(这是主因)
3。二进制格式用记事本观察就呈现“乱码”。


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-20 10:07
han2y
Rank: 1
来 自:山东德州
等 级:新手上路
帖 子:175
专家分:0
注 册:2006-5-4
得分:0 
1。用fwrite()函数是对内存的copy,copy到磁盘上;
2。教程上也是用fwrite()函数的;
3。用fwrite()函数一般是用“Wb“方式的;
4。可是用fread()函数依然能够读出正确数据;

2006-06-20 10:23
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
得分:0 
以下是引用han2y在2006-6-20 10:23:15的发言:
1。用fwrite()函数是对内存的copy,copy到磁盘上;
2。教程上也是用fwrite()函数的;
3。用fwrite()函数一般是用“Wb“方式的;
4。可是用fread()函数依然能够读出正确数据;

小妹说得对,句句是真理。该不是老谭说的吧?
现在我考考你:
1。把您的程序延伸下去,如你所说用fread()
把二进制格式的数据按人类的习惯显示出来!
2。在汉字状态下下列代码的运行结果是什么?
#include<stdio.h>
#include<stdlib.h>
main()
{
FILE*fp=fopen("c:\\unknown.txt","wb");
unsigned char s[ ]={206,210,176,174,196,227,0};
fwrite(s,sizeof(s),1,fp);
fclose(fp);
system("type c:\\unknown.txt");
}
//如果用记事本看,结果一样吗?


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-20 11:11
han2y
Rank: 1
来 自:山东德州
等 级:新手上路
帖 子:175
专家分:0
注 册:2006-5-4
得分:0 

我运行了,能不能解释解释其中的原由


2006-06-20 11:27
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
得分:0 
1。二进制文件基本上就是内存的“映像”即硬拷贝
2。六种常用基本类型的编码情况:
⑴char: 用著名的ASCII编码方案
⑵short: 16bit的二进制补码方案
⑶long : 32bit的二进制补码方案
⑷float: 32bit单精度浮点数编码(IEEE 1979)
⑸double:64bit双精度浮点数编码(IEEE 1979)
⑹汉字:大陆执行的是1980左右发布的国标(刚刚那仨字就是如此)
TW地区推行big5编码,世界上推行的是Unicode编码。这种现象在
用Word编辑时应该看得出来,收海外来的E-mail也存在类似问题
3。要搞清楚这一切是令人挠头皮的事,但深入学汇编必须懂这些
4。文本文件(与扩展名用不用txt无关)大体就是屏幕显示的样子
5。显然二进制文件具有紧凑、快速之优点,文本具有直观之优点
紧凑意味着文件短小信息密度大快速是指读入内存无须格式转换
文本文件直观是指可以在命令提示符方式下用type命令进行浏览

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-20 12:17
han2y
Rank: 1
来 自:山东德州
等 级:新手上路
帖 子:175
专家分:0
注 册:2006-5-4
得分:0 
如果把文件改成这样:
#include<stdio.h>
#include<stdlib.h>
main()
{
FILE*fp=fopen("c:\\unknown.txt","wb");
unsigned int a=10;
fwrite(a,sizeof(int),1,fp);
fclose(fp);
system("type c:\\unknown.txt");
}
取不同的a值后查看文件unknown的16进制可得:
a=10 file :43 20
11 20 2d
12 2d 20
13 20 43
14 43 6f
15 6f 70
…… ……

文本方式下是:16进制下对应的ASCII编码
我怎么看都不相信文件是内存的cpoy
如:a=10 内存下是:00000000 00001010
怎么会与文件的16进制对应呢
这如何解释呢?

2006-06-21 01:40
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
得分:0 
#include<stdio.h>
#include<stdlib.h>
main()
{
FILE*fp=fopen("c:\\unknown.txt","wb");
unsigned int a=10;
fwrite(&a,sizeof(int),1,fp);//参数1应为地址
fclose(fp);
system("type c:\\unknown.txt");
}

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-21 05:39



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-73513-1-1.html




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

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