学生成绩管理程序主菜单写出了该程序具备的功能:
我们最初的程序,实现了学生信息的增、删、改、查和打印功能,并没有文件读写功能。程序如下。
我们昨天将学生成绩管理程序的保存功能加上了,就是说我们输入的学生信息在程序结束之前都保存到一个文件里了。
此时读文件的函数readFlie( )还没有写。
程序1的第3部分,在主函数中增加一行代码:saveFlie(a); 调用saveFile( )保存我们从键盘输入的学生信息(即数组变量a的所有元素)。
但是当我们再次运行程序时,发现数据还是空的,为什么呢?因为我们没有把文件里的学生信息读到程序中。
三、如何将文件的内容读出来并保存到程序的变量中?
我们先看文件Student.txt文件里面有什么信息。
程序2:读出文件Student.txt的内容。
number是全局变量,存放学生总人数,虽然在程序2中用不到number,但是每读出文件一行信息,number就加1。
第1句:文件输入函数fscanf( )把文件内容读出来给数组a;
第3句:标准输出函数printf( )把这行信息显示出来让我们看;
如果把函数readFile( )加到学生成绩管理程序中的时候,是不需要每读出一行信息就用printf函数把这行信息输出到显示器上,这里是为了验证,所以加了这行输出信息到显示器上的代码:
如果我们把文件Student.txt删掉,现在这个文件Student.txt不存在,那么程序1是否还能正常运行呢?
出现乱码,不对了。
这是因为:
怎么改呢?
当文件不存在时,程序1运行结果为:
显示“文件不存在!”后程序就结束了,不会出现乱码。
现在我们把函数readFile( )添加到学生成绩管理程序中,在程序运行一开始就调用readFile( )把文件的内容读出到数组变量a中,此时我们把readFlie( )中的输出语句:
程序1的第2部分改为:
第一次运行程序,若文件Student.txt不存在,则先显示“文件不存咋!”以后再出现主菜单。
//
//第1部分:定义结构类型、全局变量
{ int xh; // 学号
int cj; // 成绩
int number=0; // 全局变量,学生总数
void f1(struct STUD a[]);
void f3(struct STUD a[]);
void f5(struct STUD a[]);
void readFile(struct STUD a[]);//读文件
{ FILE *fp;
fp=fopen("Student.txt","w"); //打开方式 w, 清空原有内容,全部重写
{
}
}
{ FILE *fp;
fp=fopen("Student.txt","r"); //打开方式 r, 读文件
{
}
{
{ fscanf(fp,"%d %s %d\n", &a[i].xh, a[i].name, &a[i].cj);
// printf("%d %s %d\n", a[i].xh, a[i].name, a[i].cj);
}
}
}
//第3部分 主函数
{ struct STUD a[100]; int xz, f=1;
{ printf("\n********************\n");
printf(" *3 修改 *\n *4 查询 *\n");
printf("********************\n");
scanf("%d", &xz);
{ case 1: f1(a); break;
case 3: f3(a); break;
case 5: f5(a); break;
case 0: f=0; break;
}
return 0;
//第4部分 增加学生信息的函数f1
void f1(struct STUD a[]) //增加
int n, i;
scanf("%d", &n);
for(i=number;i<number+n;i++)
printf("请输入学号:");
scanf("%d", &a[i].xh);
scanf("%s", a[i].name);
scanf("%d", &a[i].cj);
number=number+n;
printf("添加成功\n");
//第5部分 查询学生信息的函数f4
int f4(struct STUD a[]) //查询
int flag; int i,x; int xz;
scanf("%d",&x);
for(i=0;i<number;i++)
if(a[i].xh==x)
printf("找到学号为%d的学生,该生信息如下:\n",x) ;
printf("%d %s %d \n", a[i].xh,a[i].name,a[i].cj);
break;
}
if(i>=number)
printf("查无此人\n");
flag=-1;
return flag;
//第6部分 删除学生信息的函数f2
void f2(struct STUD a[]) //删除
int d=f4(a); //先调用f4查找有没有这个学生
if(d==-1)
printf(" 查无此人,无法删除\n");
{
a[d].xh=-1; //直接将学号改成-1
printf("删除成功\n");
}
//第7部分 修改学生信息的函数f3
void f3(struct STUD a[]) //修改
int d=f4(a); //先调用f4查找有没有这个学生
if(d==-1)
printf(" 查无此人,无法修改\n");
{
printf("请输入新的学号、姓名、成绩:\n");
printf("修改成功\n");
}
void f5(struct STUD a[]) //打印
int xz, flag=1, i;
for(i=0;i<number;i++)
if( a[i].xh != -1 ) //把学号不等于-1的信息删除
printf("%d %s %d\n",a[i].xh,a[i].name,a[i].cj);
}
//
至此我们完成了一个具有增删改查及保存功能的学生成绩管理程序。
