顺序读取与定位读取

sangyufeiwan 2008-11-25 07:17:42
#include <stdio.h>
#include <stdlib.h>
void main()
{FILE *fp;
struct stu { long num;
char name[20];
float total;
} s[3],a,bi,ba;
int i;
for(i=0;i<3;i++)
scanf("%d,%s,%f",&s[i].num,s[i].name,&s[i].total);
if((fp=fopen("d:\\c\\total.dat","wb"))==NULL)
{ printf("can not open file\n");exit(0);}
fwrite(s,sizeof(struct stu),3,fp);
fclose(fp);
if((fp=fopen("d:\\c\\total.dat","rb"))==NULL)
{printf("can not open file\n");exit(0);}
fread(&bi,sizeof(struct stu),1,fp);
rewind(fp);
fread(&ba,sizeof(struct stu),1,fp);
rewind(fp);
for(i=0;i<3;i++)
{ fread(&a,sizeof(struct stu),1,fp);
if(a.total>ba.total)
{ba.num=a.num;ba.name[10]=a.name[10];ba.total=a.total;}
if(a.total<bi.total)
{bi.num=a.num;bi.name[10]=a.name[10];bi.total=a.total;}
}
printf("min:%d %s %f\n",bi.num,bi.name[10],bi.total);
printf("max:%d %s %f\n",ba.num,ba.name[10],ba.total);
fclose(fp);
}
功能:设名为“d:\c\total.dat”的二进制文件中按照下列结构型,依次存放了3个学生的信息,编程,从中找到总分最高和最低的学生,并输出他们的学号,姓名和总分。 struct{long num; char name[20]; float total;};(本题不允许使用结构型数组一次读取3个学生的信息,要求先顺序读取文件查找到这2个学生的序号,在定位读取文件输出他们的信息)
我输入的数据:1073 zhao 240.00
1123 qian 360.00
1001 sun 560.00
运行后屏幕显示:min 1123 (乱码)
max 1073 (乱码)
查看“d:\c\total.dat”文件看到:1雤hao,240.00 V鑈鎅_^嬪]c¤qian,360.00 彗Y3溃?h腴鋝un,560.00 ?鎅;6?u
3溃
...全文
56 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
sangyufeiwan 2008-11-29
  • 打赏
  • 举报
回复
感谢你的指教,谢谢了!!
就呆在云上 2008-11-25
  • 打赏
  • 举报
回复
乱码是因为你用的函数fread的问题:
这里直接fread有一个问题就是可能读取乱码,因为你一行行写进去,可能根本就没有
sizeof(struct stu)这么大,因为你的name用的是20个字节,很可能写进去的是比如:
liming,就没有20个自己,很明显不行,我把你的改了,换成了我的做法,你看注释吧
我用的readme.txt,你把它改成你要的文件名字就是了,我的代码我测试过了,编译和运行良好:

#include <stdio.h> 
#include <stdlib.h>
void main()
{
FILE *fp;
struct stu {
long num;
char name[20];
float total;
} s[3],a ,bi ,ba ;
int i;
for(i=0;i <3;i++)
scanf("%d %s %f",&s[i].num,s[i].name,&s[i].total);
if((fp=fopen("readme.txt","wb"))==NULL)
{
printf("can not open file\n");exit(0);
}
for(i=0;i <3;i++)
fprintf(fp,"%d %s %.3f\n",s[i].num,s[i].name,s[i].total);
fclose(fp);
if((fp=fopen("readme.txt","rb"))==NULL)
{
printf("can not open file\n");
exit(0);
}
/*
这里直接fread有一个问题就是可能读取乱码,因为你一行行写进去,可能根本就没有
sizeof(struct stu)这么大,因为你的name用的是20个字节,很可能写进去的是比如:
liming,就没有20个自己,很明显不行,我把你的改了,换成了我的做法,你看吧:

fread(&bi,sizeof(struct stu),1,fp);
rewind(fp);
fread(&ba,sizeof(struct stu),1,fp);
rewind(fp);
*/
fseek( fp, 0L, SEEK_SET );

fscanf(fp, "%d %s %f",&bi.num,bi.name,&bi.total);
fscanf(fp, "%d %s %f",&ba.num,ba.name,&ba.total);
rewind(fp);
for(i=0;i <3;i++)
{
fscanf(fp, "%d %s %f",&a.num,a.name,&a.total);
if(a.total>ba.total)
{
ba.num=a.num;ba.name[10]=a.name[10];ba.total=a.total;
}
if(a.total <bi.total)
{
bi.num=a.num;bi.name[10]=a.name[10];bi.total=a.total;
}
}
printf("min:%d %s %f\n",bi.num,bi.name,bi.total);
printf("max:%d %s %f\n",ba.num,ba.name,ba.total);
fclose(fp);
}

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧