C 语言,文件操作将结构体数组用fwrite写入文件后,打开时为什么文件中会是一堆乱码?
#include<stdio.h>#include<string.h>#include<stdlib.h>#defineN20#defineM3typedefstruct...
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 20
#define M 3
typedef struct
{
char name[20];
int score[M];
double avg;
}stu;
void swap(stu*m,stu*n)
{
stu t=*m;
*m=*n;
*n=t;
}
void input(stu*s,int n)
{
int i,j;
double sum=0;
for(i=0;i<n;i++)
{
printf("请输入姓名:");
scanf("%s",s[i].name);
printf("请输入分数(英语数C):");
for(j=0;j<M;j++)
scanf("%d",&s[i].score[j]);
printf("\n");
}
}
void sort(stu*s,int n)
{
int i,j;
double sum=0;
for(i=0;i<n;i++)
{
for(j=0;j<M;j++)
sum+=s[i].score[j];
s[i].avg=sum/M;
sum=0;
}
for(i=1;i<n;i++)
for(j=0;j<n-i;j++)
{
if(s[j].avg<s[j+1].avg)
swap(&s[j],&s[j+1]);
else if((s[j].avg==s[j+1].avg)&&(strcmp(s[j].name,s[j+1].name)<0))
swap(&s[j],&s[j+1]);
}
}
void save(stu*s,int n)
{
FILE*fp;
int i;
fp=fopen("d:\\data.dat","w");
for(i=0;i<n;i++)
fwrite(&s[i],sizeof(stu),1,fp);
fclose(fp);
}
void output(stu*s,int n)
{
int i=0,j;
FILE*fp;
if((fp=fopen("d:\\data.dat","r"))==NULL)
{
printf("fail\n");
exit(0);
}
while(!feof(fp))
{
fread(&s[i],sizeof(stu),1,fp);
i++;
}
fclose(fp);
for(i=0;i<n;i++)
{
printf("%s\t",s[i].name);
for(j=0;j<M;j++)
printf("%d ",s[i].score[j]);
printf("%.1lf",s[i].avg);
printf("\n");
}
}
void main()
{
int n;
stu s[N];
printf("input n:");
scanf("%d",&n);
input(s,n);
sort(s,n);
save(s,n);
output(s,n);
} 展开
#include<string.h>
#include<stdlib.h>
#define N 20
#define M 3
typedef struct
{
char name[20];
int score[M];
double avg;
}stu;
void swap(stu*m,stu*n)
{
stu t=*m;
*m=*n;
*n=t;
}
void input(stu*s,int n)
{
int i,j;
double sum=0;
for(i=0;i<n;i++)
{
printf("请输入姓名:");
scanf("%s",s[i].name);
printf("请输入分数(英语数C):");
for(j=0;j<M;j++)
scanf("%d",&s[i].score[j]);
printf("\n");
}
}
void sort(stu*s,int n)
{
int i,j;
double sum=0;
for(i=0;i<n;i++)
{
for(j=0;j<M;j++)
sum+=s[i].score[j];
s[i].avg=sum/M;
sum=0;
}
for(i=1;i<n;i++)
for(j=0;j<n-i;j++)
{
if(s[j].avg<s[j+1].avg)
swap(&s[j],&s[j+1]);
else if((s[j].avg==s[j+1].avg)&&(strcmp(s[j].name,s[j+1].name)<0))
swap(&s[j],&s[j+1]);
}
}
void save(stu*s,int n)
{
FILE*fp;
int i;
fp=fopen("d:\\data.dat","w");
for(i=0;i<n;i++)
fwrite(&s[i],sizeof(stu),1,fp);
fclose(fp);
}
void output(stu*s,int n)
{
int i=0,j;
FILE*fp;
if((fp=fopen("d:\\data.dat","r"))==NULL)
{
printf("fail\n");
exit(0);
}
while(!feof(fp))
{
fread(&s[i],sizeof(stu),1,fp);
i++;
}
fclose(fp);
for(i=0;i<n;i++)
{
printf("%s\t",s[i].name);
for(j=0;j<M;j++)
printf("%d ",s[i].score[j]);
printf("%.1lf",s[i].avg);
printf("\n");
}
}
void main()
{
int n;
stu s[N];
printf("input n:");
scanf("%d",&n);
input(s,n);
sort(s,n);
save(s,n);
output(s,n);
} 展开
展开全部
注意你的写入语句:
fwrite(&s[i],sizeof(stu),1,fp);
你这样是以二进制的形式将stu结构写入文件的。
typedef struct
{
char name[20];
int score[M];
double avg;
}stu;
应该用fprintf函数分三次完成一个记录的输出:
fprintf(fp,"%s\t", s[i].name);
int j; //在前面补充定义
for(j=0;j < M;j++) fprintf(fp,"%d\t", s[i].score[j]);
fprintf(fp,"%f\n", s[i].avg);
对应的fread也要修改。我改好了传上来。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 20
#define M 3
typedef struct
{
char name[20];
int score[M];
double avg;
}stu;
void swap(stu*m,stu*n)
{
stu t=*m;
*m=*n;
*n=t;
}
void input(stu*s,int n)
{
int i,j;
double sum=0;
for(i=0;i<n;i++)
{
printf("请输入姓名:");
scanf("%s",s[i].name);
printf("请输入分数(英语数C):");
for(j=0;j<M;j++)
scanf("%d",&s[i].score[j]);
printf("\n");
}
}
void sort(stu*s,int n)
{
int i,j;
double sum=0;
for(i=0;i<n;i++)
{
for(j=0;j<M;j++)
sum+=s[i].score[j];
s[i].avg=sum/M;
sum=0;
}
for(i=1;i<n;i++)
for(j=0;j<n-i;j++)
{
if(s[j].avg<s[j+1].avg)
swap(&s[j],&s[j+1]);
else if((s[j].avg==s[j+1].avg)&&(strcmp(s[j].name,s[j+1].name)<0))
swap(&s[j],&s[j+1]);
}
}
void save(stu*s,int n)
{
FILE*fp;
int i, j;
fp=fopen("d:\\data.dat","w");
for(i=0;i<n;i++)
{
//fwrite(&s[i],sizeof(stu),1,fp);
fprintf(fp,"%s\t", s[i].name);
for(j=0;j < M;j++) fprintf(fp,"%d\t", s[i].score[j]);
fprintf(fp,"%f\n", s[i].avg);
}
fclose(fp);
}
void output(stu*s,int n)
{
int i=0,j;
FILE*fp;
if((fp=fopen("d:\\data.dat","r"))==NULL)
{
printf("fail\n");
exit(0);
}
while(!feof(fp))
{
//fread(&s[i],sizeof(stu),1,fp);
fscanf(fp, "%s",s[i].name);
for(j=0;j<M; j++) fscanf(fp,"%d", &s[i].score[j]);
fscanf(fp, "%f",&s[i].avg);
i++;
}
fclose(fp);
for(i=0;i<n;i++)
{
printf("%s\t",s[i].name);
for(j=0;j<M;j++)
printf("%d ",s[i].score[j]);
printf("%.1lf",s[i].avg);
printf("\n");
}
}
void main()
{
int n;
stu s[N];
printf("input n:");
scanf("%d",&n);
input(s,n);
sort(s,n);
save(s,n);
output(s,n);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询