怎样解决数据存储乱码的问题……

kyoyeah 2005-07-01 02:55:33
先看看小弟写的代码:
#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()来写入数据的,但是写了数据后在读出来的又是一团乱东西,究竟怎样可以使数据存读时都不要乱码呢?
...全文
182 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
kyoyeah 2005-07-01
  • 打赏
  • 举报
回复
那请问用fread()读取用fprintf()保存的数据块时,在终端输出的是什么?会不会和在文本文档里的数据一样?我意思是形式上,即有无发生字符的转换
FBIq 2005-07-01
  • 打赏
  • 举报
回复
好不好看情况了,当你要写入的是数据块,也只是保存是,这时用fwrite是明智的!
FBIq 2005-07-01
  • 打赏
  • 举报
回复
用fprintf写入会自动转换成字符,fwrite则不然,而在windows打开的时候是以文本方式打开的,所以不会出现乱码!
如有不对请指正!
kyoyeah 2005-07-01
  • 打赏
  • 举报
回复
但是用fwrite写入的都是二进制的哦……打开时乱码
用fprintf()好
FBIq 2005-07-01
  • 打赏
  • 举报
回复
EOF是fprintf()函数写入失败的返回值
FBIq 2005-07-01
  • 打赏
  • 举报
回复
fwrite是以结构为单位写入的,而fprintf是以成员为单位的,所以前者效率高过后者!
kyoyeah 2005-07-01
  • 打赏
  • 举报
回复
我想问是不是每个用fwrite写入的的地方都要该为fprintf啊?
另外是不是把fprintf(fp,"%s\n",stu[i].num)!=0 改为 fprintf(fp,"%s\n",stu[i].num)==EOF 啊?
FBIq 2005-07-01
  • 打赏
  • 举报
回复
这里再改下:fprintf(fp,"%s\n",stu[i].num)==EOF
FBIq 2005-07-01
  • 打赏
  • 举报
回复
for(i=0;i<3;i++)
{
if(fprintf(fp,"%s\n",stu[i].num)!=0)
printf("File write error\n");
if(fprintf(fp,"%s\n",stu[i].name)!=0)
printf("File write error\n");
for(j=0;j<2;j++)
{fprintf(fp,"score %d :",j+1);
fprintf(fp,"%8d",stu[i].score[j]);
sum+=stu[i].score[j];
}
if(fprintf(fp,"%f\n",stu[i].ave)!=0)
printf("File write error\n");
}

69,373

社区成员

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

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