怎样解决数据存储乱码的问题……
先看看小弟写的代码:
#include"stdio.h"
#define N 3
struct student
{char num[8];
char name[8];
int score[2];
float ave;
}stu[3],temp;
main()
{
int i,j,sum;
FILE *fp;
for(i=0;i<3;i++)
{printf("\nInput score of student %d:\n",i+1);
printf("name:");
scanf("%s",stu[i].name);
printf("NO.:");
scanf("%s",stu[i].num);
sum=0;
for(j=0;j<2;j++)
{printf("score %d :",j+1);
scanf("%8d",&stu[i].score[j]);
sum+=stu[i].score[j];
}
stu[i].ave=sum/2.0;
}
/*将数据写入文件"student"*/
fp=fopen("student.txt","w");
printf("NO. name english math ave\n");
for(i=0;i<3;i++)
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
printf("File write error\n");
fclose(fp);
/*请查文件内容*/
fp=fopen("student.txt","r");
for(i=0;i<3;i++)
{fread(&stu[i],sizeof(struct student),1,fp);
printf("\n%s %8s",stu[i].num,stu[i].name);
for(j=0;j<2;j++)
{printf("%8d",stu[i].score[j]);}
printf("%10.2f\n",stu[i].ave);
}
fun1();
fun2();
getch();
} /*以将本班学生的信息存放于文件student.txt*/
fun1()
{FILE *fp;
int i,j,k,m,n;
/*读文件*/
if((fp=fopen("student.txt","r"))==NULL)
{printf("Can not open the file.");
exit(0);
}
printf("\nfile 'score':");
for(i=0;fread(&stu[i],sizeof(struct student),1,fp)!=0;i++)
{printf("\n%8s%8s",stu[i].num,stu[i].name);
for(j=0;j<2;j++)
{printf("%8d",stu[i].score[j]);}
printf("%10.2f",stu[i].ave);
}
fclose(fp);
printf("\nchoose course 1 or 2:?");
printf(" 1 represent score[1],2 represent score[2].");
scanf("%d",&m);
printf("\nchoose num 1 or 2?");
printf(" 1 represent sort descending,2 represent sort ascending.\n");
scanf("%d",&k);
n=i;
if(m==1) {descending(k,n);ascending(k,n);}
if(m==2) {ascending(k,n);descending(k,n);}
fclose(fp);
}
/*降序*/
descending(int k,int n)
{FILE *fp;
int i,j;
if(k==1)
{for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(stu[i].score[1]<stu[j].score[1])
{temp=stu[i];stu[i]=stu[j];stu[j]=temp;}
/*输出*/
printf("\nnow:");
fp=fopen("score.txt","w");
for(i=0;i<n;i++)
{fwrite(&stu[i],sizeof(struct student),1,fp);
printf("\n%d%8s%8s",i+1,stu[i].num,stu[i].name);
for(j=0;j<2;j++)
{printf("%8d",stu[i].score[j]);}
printf("%10.2f",stu[i].ave);
}
}
}
/*升序*/
ascending(int k,int n)
{FILE *fp;
int i,j,l;
if(k==2)
{for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(stu[i].score[1]>stu[j].score[1])
{temp=stu[i];stu[i]=stu[j];stu[j]=temp;}
/*输出*/
printf("\nnow:");
fp=fopen("score.txt","w");
for(i=0,l=N;i<n;i++,l--)
{fwrite(&stu[i],sizeof(struct student),1,fp);
printf("\n%d%8s%8s",l,stu[i].num,stu[i].name);
for(j=0;j<2;j++)
{printf("%8d,%8d",stu[i].score[j]);}
printf("%10.2f",stu[i].ave);
}
}
}
fun2()
{FILE *fp;
int i,j,m,num,begin,end,mid,loca,flag=1,sign=1;
char c;
/*读文件*/
if((fp=fopen("score.txt","r"))==NULL)
{printf("Can not open the file.");
exit(0);
}
printf("\nWhich couse do you want to seach: score 1 or score 2?");
scanf("%d",&m);
ascending(2,N);
flag=1; /*二分法*/
while(flag)
{sign=1;
printf("\nInput number to look for:");
scanf("%d",&num);
loca=0;begin=0;end=N-1;
if((num<stu[0].score[m-1])||(num>stu[N-1].score[m-1]))
loca=-1;
while((sign==1)&&(begin<=end))
{mid=(end+begin)/2;
if(num==stu[mid].score[m-1])
{loca=mid;
printf("Find %d ,its position is %d\n",num,loca+1);
sign=0;
}
else if(num<stu[mid].score[m-1])
end=mid-1;
else
begin=mid+1;
}
if(sign==1||loca==-1)
printf("%d is not found.\n",num);
getchar();
printf("Continue or not(Y/N)?");
scanf("%c",&c);
if(c=='N'||c=='n')
flag=0;
}
fclose(fp);
}
程序运行基本没问题,但是把数据存储到student.txt和score.txt时,打开发现是乱码的
本来想到用fprintf()来写入数据的,但是写了数据后在读出来的又是一团乱东西,究竟怎样可以使数据存读时都不要乱码呢?