关于写入文件的问题
#include<stdio.h>#include<string.h>
//记录总数
int num=0;
//结构体定义
struct Student
{
char id[10];
char name[20];
float mark1;//语文
float mark2;//数学
float mark3;//外语
float average;//平均
}stu[1000];
//显示学生记录
void fp_show(int i)
{
printf("\t学号\t姓名\t语文\t数学\t外语\t平均成绩\n");
printf("-------------------------------------------------------------\n");
printf("%10s%10s%8.2f%8.2f%8.2f%10.2f\n",stu[i].id,stu[i].name,
stu[i].mark1,stu[i].mark2,stu[i].mark3,stu[i].average);
}
//1增加学生记录
void fp_add()
{
while(1)
{
printf("\n请输入学号:\n");
scanf("%s",stu[num].id);
printf("\n请输入姓名:\n");
scanf("%s",stu[num].name);
printf("\n请输入语文成绩:\n");
scanf("%f",&stu[num].mark1);
printf("\n请输入数学成绩:\n");
scanf("%f",&stu[num].mark2);
printf("\n请输入英语成绩:\n");
scanf("%f",&stu[num].mark3);
stu[num].average=(stu[num].mark1+stu[num].mark2+stu[num].mark3)/3;
num++;
getchar();
printf("\n是否继续添加(y/n)\n");
if(getchar()=='n') break;
}
}
//2修改学生记录
void fp_modify()
{ char a[20];
int i,t;
while(1)
{
printf("\n请输入学生学号:\n");
scanf("%s",a);
for(t=0;t<num;t++)
{
if(strcmp(stu[t].id,a)==0)
i=t;
}
if(i>=0){
fp_show(i);
printf("\n请输入修改后的学号\n");
scanf("%s",stu[i].id);
printf("\n请输入修改后的姓名\n");
scanf("%s",stu[i].name);
printf("\n请输入修改后的语文\n");
scanf("%f",&stu[i].mark1);
printf("\n请输入修改后的数学\n");
scanf("%f",&stu[i].mark2);
printf("\n请输入修改后的外语\n");
scanf("%f",&stu[i].mark3);
stu[i].average=(stu[i].mark1+stu[i].mark2+stu[i].mark3)/3;}
else
printf("失败");
getchar();
printf("\n是否继续修改(y/n)?\n");
if(getchar()=='n') return;
}
}
//3删除学生记录
void fp_delete()
{int i,t,a[20];
while(1){
printf("\n请输入删除的学生学号:\n");
scanf("%s",a);
for(t=0;t<num;t++)//返回下标;
{
if(strcmp(stu[t].id,a)==0)
i=t;
}
if(i>=0)
{
fp_show(i);
getchar();
printf("\n是否真的要删除?(y/n)\n");
if(getchar()=='y')
{
for(t=i;t<num-1;t++)
stu[t]=stu[t+1];
num--;
}
}
else
printf("失败");
getchar();
printf("\n是否继续删除(y/n)?\n");
if(getchar()=='n') return;
}
}
//4按姓名查询学生记录
void fp_search()
{ void fp_show(int);
char a[20];
int i,t;
while(1)
{
printf("\n请输入学生姓名:\n");
scanf("%s",a);
for(i=0;i<num;i++)
{
if(strcmp(stu[i].name,a)==0)
t=i;
}
if(t>=0)
fp_show(t);
else
printf("失败");
getchar();
printf("\n返回/继续 y/n\n");
if(getchar()=='y') break;
}
}
//5按成绩排序
void fp_grades()
{int i,j;
struct Student temp;
for(i=0;i<num-1;i++)//冒泡法排序
for(j=0;j<num-1-i;j++)
if(stu[i].average>stu[i+1].average)
{ temp=stu[i];
stu[i]=stu[i+1];
stu[i+1]=temp;
}
//输出成绩排序
printf("\t学号\t姓名\t语文\t数学\t外语\t平均成绩\n");
printf("-------------------------------------------------------------\n");
for(i=num-1;i>=0;i--){
printf("%10s%10s%8.2f%8.2f%8.2f%10.2f\n",stu[i].id,stu[i].name,
stu[i].mark1,stu[i].mark2,stu[i].mark3,stu[i].average);
}
getchar();
printf("\n请输入y返回\n");
if(getchar()=='y') return;
}
//打开文件
void fp_open()
{ FILE *fp;
int i;
if((fp=fopen("database.txt","rb"))==NULL)
{
printf("打开文件失败;\n");
return;
}
if(fread(&num,sizeof(int),1,fp)!=1)
{
num=0;
}else
{
for(i=0;i<num;i++)
fread(&stu[i],sizeof(struct Student),1,fp);
}
fclose(fp);
}
//写进数据
void fp_write()
{
FILE *fp;
int i;
if((fp=fopen("database.txt","wb"))==NULL)
{
printf("打开文件失败;\n");
return;
}
if(fwrite(&num,sizeof(int),1,fp)!=1)
{
printf("写入错误;\n");
}
{for(i=0;i<num;i++)
if(fwrite(&stu[i],sizeof(struct Student),1,fp)!=1)
printf("写入错误\n");
}
fclose(fp);
}
//主程序
int main()
{ int choice;
//打开文件
fp_open();
while(1)
{
printf("\n\n◇◇◇◇◇◇◇◇成 绩 管 理 小 程 序◇◇◇◇◇◇◇◇\n\n\n");
printf("\t☆\t1. 增加学生信息\t☆\n");
printf("\t☆\t2. 修改学生信息\t☆\n");
printf("\t☆\t3. 删除学生信息\t☆\n");
printf("\t☆\t4. 查询学生信息\t☆\n");
printf("\t☆\t5. 平均成绩排序\t☆\n");
printf("\t☆\t6. 保存 并退出\t☆\n\n");
printf("◇请选择(1-6)◇ \n");
scanf("%d",&choice);
switch(choice)
{
case 1 : fp_add(); break;
case 2 : fp_modify(); break;
case 3 : fp_delete(); break;
case 4 : fp_search(); break;
case 5 : fp_grades(); break;
default: exit(0);break;
}
//关闭并写入数据
fp_write();
}
return 0;
}
//为什么在写入文件的时候,文件记录有错误呢?