三个student结构体写入文件,再读出来解决办法
三个student结构体写入文件,再读出来
[code=C/C++][/code]
#include"StdAfx.h"
#include"stdlib.h"
#define M 3
struct student
{
int num;
char name[20];
float s1;
float s2;
float s3;
float avg;
};
bool MyFileWrite(student stu[],int Num)
{
FILE* fp = fopen("stud","wb");
if(fp == NULL)
return false;
if(fwrite(&Num,sizeof(int),1,fp)!=1)
return false;
for(int i=0;i<Num;i++)
{
if(fwrite(&stu[i],sizeof(student),1,fp)!=1)
return false;
}
fflush(fp);
fclose(fp);
return true;
}
void main()
{
student st[M];
FILE *fp;
int i;
printf("Çë·Ö±ðÊäÈë3ÃûѧÉúµÄѧºÅ,ÐÕÃû,µÚ1,2,3¿Æ³É¼¨,ÒÔ¿Õ¸ñ·Ö¿ª\n");
for(i=0;i<M;i++)
{
scanf("%d %s %f %f %f",&st[i].num,st[i].name,&st[i].s1,&st[i].s2,&st[i].s3);
st[i].avg=(st[i].s1+st[i].s2+st[i].s3)/3;
}
if(MyFileWrite(st,M) == false)
printf("´íÎó\n");
fp=fopen("stud","rb");
printf("3ÃûѧÉú³É¼¨Îª\n");
printf("num\tname\tscore1\tscore2\tscore3\taverage\n");
for(i=0;i<M;i++)
{
fread(&st[i],sizeof(student),1,fp);
printf("%d\t%s\t%f\t%f\t%f\t%f\n",st[i].num,st[i].name,st[i].s1,st[i].s2,st[i].s3,st[i].avg);
}
}
写进去再读出来printf看到的是乱码
如果不调用MyFileWrite,把MyFileWrite函数里的代码写到main函数里就没这问题
这是怎么回事吖
------解决方案--------------------
你写文件的时候在文件头写入了结构体数组长度M,然后再写结构体内容
可是你读的时候从一开始就已结构体大小读数据,这样肯定会有问题,应该跳过之前文件头存结构体数组长度的4个字节
[code=C/C++][/code]
#include"StdAfx.h"
#include"stdlib.h"
#define M 3
struct student
{
int num;
char name[20];
float s1;
float s2;
float s3;
float avg;
};
bool MyFileWrite(student stu[],int Num)
{
FILE* fp = fopen("stud","wb");
if(fp == NULL)
return false;
if(fwrite(&Num,sizeof(int),1,fp)!=1)
return false;
for(int i=0;i<Num;i++)
{
if(fwrite(&stu[i],sizeof(student),1,fp)!=1)
return false;
}
fflush(fp);
fclose(fp);
return true;
}
void main()
{
student st[M];
FILE *fp;
int i;
printf("Çë·Ö±ðÊäÈë3ÃûѧÉúµÄѧºÅ,ÐÕÃû,µÚ1,2,3¿Æ³É¼¨,ÒÔ¿Õ¸ñ·Ö¿ª\n");
for(i=0;i<M;i++)
{
scanf("%d %s %f %f %f",&st[i].num,st[i].name,&st[i].s1,&st[i].s2,&st[i].s3);
st[i].avg=(st[i].s1+st[i].s2+st[i].s3)/3;
}
if(MyFileWrite(st,M) == false)
printf("´íÎó\n");
fp=fopen("stud","rb");
printf("3ÃûѧÉú³É¼¨Îª\n");
printf("num\tname\tscore1\tscore2\tscore3\taverage\n");
for(i=0;i<M;i++)
{
fread(&st[i],sizeof(student),1,fp);
printf("%d\t%s\t%f\t%f\t%f\t%f\n",st[i].num,st[i].name,st[i].s1,st[i].s2,st[i].s3,st[i].avg);
}
}
写进去再读出来printf看到的是乱码
如果不调用MyFileWrite,把MyFileWrite函数里的代码写到main函数里就没这问题
这是怎么回事吖
------解决方案--------------------
你写文件的时候在文件头写入了结构体数组长度M,然后再写结构体内容
可是你读的时候从一开始就已结构体大小读数据,这样肯定会有问题,应该跳过之前文件头存结构体数组长度的4个字节