C语言学生信息系统的编程设计

问题遇到的现象和发生背景
遇到的现象和发生背景,请写出第一个错误信息

第一次我输入信息存入了文件,此时可以正确显示学生信息,当我关闭程序再次运行,输入2想要显示正确信息时发生了错误

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
#include 
#include 
#include 
#include 

#define N 3
struct student  //定义一个学生信息的结构体 
{
char name[100];  //姓名 
char num[100];   //学号 
char sex;        //性别 
int age;         //年龄 
char note[100];  //备注 
};
void print()//打印初始页面 
{
printf("|************欢迎进入学生档案管理系统*******************|\n"
       "|------------------主菜单---------------------|\n"
       "|-----------1-学生基本信息录入----------------|\n"
       "|-----------2-学生基本信息显示----------------|\n"
       "|-----------3-学生基本信息保存----------------|\n"
       "|-----------4-学生基本信息删除----------------|\n"
       "|-----------5-学生基本信息修改----------------\n"
       "|-----------6-学生基本信息查询----------------|\n"
       "|-----------7-退出学生信息系统----------------|\n"  
       "            请输入您需要的选择 : \n");
}
bool Check(char pas[6])//密码验证 
{
system("cls");//清屏 
FILE *fp;
char ch;
char a[7]={" "};
int i = 0;
if ((fp=fopen("c1.txt","r"))==NULL)//读取密码,文件中设置密码为123456 
{
printf("打开文件失败!\n");
exit(0);
}
ch=fgetc(fp);
while (ch!=EOF&&i<6)
{
a[i] = ch;
ch=fgetc(fp);
i++;
}
a[6] = '\0';
if (!strcmp(pas,a))
{
return true;
}
else
{
printf("密码错误\n");
return false;
}
fclose(fp);
}
void Get(struct student *arr,int n)//学生基本信息录入
{ 
  int i;
  for (i=0;iprintf(" 输入学生的基本信息 : 姓名 学号 性别 (m/w) 年龄 备注\n");
   scanf("%s %s %c %d %s",arr[i].name,arr[i].num,arr[i].sex,arr[i].age,arr[i].note);
  }
}
void Display(struct student* arr,int n)//学生基本信息显示
{ 
system("cls");
 int i;
  printf("学生信息:姓名 学号 性别 年龄 备注\n");
   for (i = 0;iprintf("%15s%15s%15c%15d%15s\n",arr[i].name,arr[i].num,arr[i].sex,arr[i].age,arr[i].note);
  }
}
void Save(struct student* arr,int n)//学生基本信息保存, 保存在 student.txt
{
system("cls");
FILE * fp;
fp= fopen("student.txt","w+");
  if (fp == NULL)
  {
   printf("文件不存在!\n");
   exit(0);
  }
fwrite(arr,sizeof(struct student)*n,n,fp);
fclose(fp);
}
void Modify(struct student* arr,int n)//学生基本信息修改
{
char number[10];
int temp;
bool flag=false;
char pass[6];
printf("请输入密码:\n");
scanf("%s",pass);
if (Check(pass))
{
printf("---------------1-修改学号-----------\n"
       "---------------2-修改姓名-----------\n"
       "---------------3-修改性别-----------\n"
       "---------------4-修改年龄-----------\n"
       "---------------5-退出 ---------\n");
scanf("%d",&temp);
switch(temp)
{
case 1://修改学号
{
printf("修改学生信息:\n");
printf("请输入学号:\n");
scanf("%s",number);
for (int i =0;iif (!strcmp(number,arr[i].num))
  {
   printf("学生信息:姓名 学号 性别 年龄 备注 \n");
   printf("%4s%4s%4c%4d%4s\n",arr[i].name,arr[i].num,arr[i].sex,arr[i].age,arr[i].note);
   printf("重新输入该学生的学号:\n");
   scanf("%s",arr[i].num);
   Save(arr,n);
   flag = true;
    if (flag == false)
    {  
      printf("该学生不存在!:\n");
    } 
  }
}
}
break;
case 2://修改姓名
{
printf("修改学生信息:\n");
printf("请输入学号:\n");
scanf("%s",number);
for (int i =0;iif (!strcmp(number,arr[i].num))
  {
   printf("学生信息:姓名 学号 性别 年龄 备注 \n");
   printf("%4s%4s%4c%4d%4s\n",arr[i].name,arr[i].num,arr[i].sex,arr[i].age,arr[i].note);
   printf("重新输入该学生的姓名:\n");
   scanf("%s",arr[i].name);
   Save(arr,n);
   flag = true;
   if (flag == false)
   {
     printf("该学生不存在!:\n");
   }  
  }
}
}
break;
case 3://修改性别
{
printf("修改学生信息:\n");
printf("请输入学号:\n");
scanf("%s",number);
for (int i =0;iif (!strcmp(number,arr[i].num))
  {
   printf("学生信息:姓名 学号 性别 年龄 备注 \n");
   printf("%4s%4s%4c%4d%4s\n",arr[i].name,arr[i].num,arr[i].sex,arr[i].age,arr[i].note);
   printf("重新输入该学生的性别:\n");
   scanf("%c",&arr[i].sex);
   Save(arr,n);
   flag = true;
   if (flag == false)
   {
    printf("该学生不存在!:\n");
   }
  } 
}
}
break;
case 4://修改年龄
{
printf("修改学生信息:\n");
printf("请输入学号:\n");
scanf("%s",number);
for (int i =0;iif (!strcmp(number,arr[i].num))
  { 
   printf("学生信息:姓名 学号 性别 年龄 备注 \n");
   printf("%4s%4s%4c%4d%4s\n",arr[i].name,arr[i].num,arr[i].sex,arr[i].age,arr[i].note);
   printf("重新输入该学生的年龄:\n");
   scanf("%d",&arr[i].age);
   Save(arr,n);
   flag = true;
   if (flag == false)
   {
   printf("该学生不存在!:\n");
   }  
  }
}
}
break;
default:
break;
}
}
}
void Delete(struct student* arr,int n)//学生基本信息删除
{
int i;
char number[10];
bool flag=false;
printf("删除学生信息:\n");
printf("请输入学号:\n");
scanf("%s",number);
for (i =0;iif (!strcmp(number,arr[i].num))
   {
    strcpy(arr[i].name," ");
    strcpy(arr[i].num," ");
    strcpy(arr[i].note," ");
    arr[i].sex = ' ';
    arr[i].age = 0;
    Save(arr,n);
    flag = true;
   }
}
   if (flag == true)
   { 
    printf("该学生不存在!:\n");
   }  
}
void Search(struct student* arr,int n)//学生基本信息查询
{

int temp,i;
bool flag=false;
printf("---------------1-学号查询-----------\n"
       "---------------2-姓名查询-----------\n"
       "---------------3-性别查询-----------\n"
       "---------------4-年龄查询-----------\n"
       "---------------5-退出 ---------\n");
scanf("%d",&temp);
switch (temp)
{
case 1://按照学号查询
{
char num[10];
printf("请输入学号:\n");
scanf("%s",num);
for ( i =0;iif (!strcmp(num,arr[i].num))
  {
   printf("%12s%12s%12c%12d%12s\n",arr[i].name,arr[i].num,
   arr[i].sex,arr[i].age,arr[i].note);
   flag = true;
  }
}
  if (!flag)
  {
   printf("该学生不存在.\n");
  }
}
break;
case 2://按照名字查询
{
char num[10];
printf("please input name:\n");
scanf("%s",num);
for ( i =0;iif (!strcmp(num,arr[i].name))
  {
   printf("%12s%12s%12c%12d%12s",arr[i].name,arr[i].num,
   arr[i].sex,arr[i].age,arr[i].note);
   flag = true;
  }
}
  if (!flag)
  {
   printf("该学生不存在.\n");
  }  
}
break;
case 3://按照性别查询
{
char ch;
printf("请输入性别:\n");
scanf("%c",&ch);
ch = getch();
for ( i =0;iif (ch == arr[i].sex)
 {
  printf("%12s%12s%12c%12d%12s\n",arr[i].name,arr[i].num,
  arr[i].sex,arr[i].age,arr[i].note);
  flag = true;
 }
}
if (!flag)
{
printf("该学生不存在:\n");
}
}
break;
case 4://按照年龄查询
{
char num_age;
printf("请输入年龄:\n");
scanf("%d",&num_age);
for ( i =0;iif (num_age == arr[i].age)
  { 
   printf("%12s%12s%12c%12d%12s\n",arr[i].name,arr[i].num,arr[i].sex,arr[i].age,arr[i].note);
   flag = true;
  }
}
  if (!flag)
  {
   printf("该学生不存在.\n");
  }
}
break;
default:break;
}
}
 
int main()
{
struct student arr[N];
char ps[6];
bool flag =false;
printf("请输入密码:\n");
scanf("%s",ps);
flag = Check(ps);
if (flag)
{
int select;
print();
scanf("%d",&select);
  while (0

给Get()函数里的scanf()函数获取性别和年龄时相应变量加上取址符,然后Save函数保存文件的方式修改下,再把Display方法改为从文件读取学生信息即可;

程序的运行过程则是:先输入1,从输入获取学生信息;然后输入3,保存获取的学生信息到文件;再输入2,从文件读取学生信息显示出来;

修改如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define N 3
struct student  //定义一个学生信息的结构体 
{
char name[100];  //姓名 
char num[100];   //学号 
char sex;        //性别 
int age;         //年龄 
char note[100];  //备注 
};
void print()//打印初始页面 
{
printf("|************欢迎进入学生档案管理系统*******************|\n"
       "|------------------主菜单---------------------|\n"
       "|-----------1-学生基本信息录入----------------|\n"
       "|-----------2-学生基本信息显示----------------|\n"
       "|-----------3-学生基本信息保存----------------|\n"
       "|-----------4-学生基本信息删除----------------|\n"
       "|-----------5-学生基本信息修改----------------\n"
       "|-----------6-学生基本信息查询----------------|\n"
       "|-----------7-退出学生信息系统----------------|\n"  
       "            请输入您需要的选择 : \n");
}
bool Check(char pas[6])//密码验证 
{
system("cls");//清屏 
FILE *fp;
char ch;
char a[7]={" "};
int i = 0;
if ((fp=fopen("c1.txt","r"))==NULL)//读取密码,文件中设置密码为123456 
{
printf("打开文件失败!\n");
exit(0);
}
ch=fgetc(fp);
while (ch!=EOF&&i<6)
{
a[i] = ch;
ch=fgetc(fp);
i++;
}
a[6] = '\0';
if (!strcmp(pas,a))
{
return true;
}
else
{
printf("密码错误\n");
return false;
}
fclose(fp);
}

void Get(struct student *arr,int n)//学生基本信息录入
{ 
  int i;
      FILE * fp;
    fp= fopen("student.txt","w+");
      if (fp == NULL)
      {
       printf("文件不存在!\n");
       exit(0);
      }
      
  for (i=0;i<n;i++)
  {
   printf(" 输入学生的基本信息 : 姓名 学号 性别 (m/w) 年龄 备注\n");
   
   scanf("%s %s %c %d %s",arr[i].name,arr[i].num,&arr[i].sex,&arr[i].age,arr[i].note);
   fprintf(fp,"%s %s %c %d %s\n",arr[i].name,arr[i].num,arr[i].sex,arr[i].age,arr[i].note);
  }
  fclose(fp);
}



void Display(struct student* arr,int n)//学生基本信息显示
{ 
    system("cls");

        FILE * fp;
    fp= fopen("student.txt","r");
      if (fp == NULL)
      {
       printf("文件不存在!\n");
       exit(0);
      }
      

     int i;
      printf("学生信息:姓名 学号 性别 年龄 备注\n");
       for (i = 0;i<n;i++)
      {
          
      
       fscanf(fp,"%s %s %c %d%s\n",arr[i].name,arr[i].num,&arr[i].sex,&arr[i].age,arr[i].note);
       printf("%15s%15s%15c%15d%15s\n",arr[i].name,arr[i].num,arr[i].sex,arr[i].age,arr[i].note);
      }
      fclose(fp);
}

void Save(struct student* arr,int n)//学生基本信息保存, 保存在 student.txt
{
system("cls");
FILE * fp;
fp= fopen("student.txt","w+");
  if (fp == NULL)
  {
   printf("文件不存在!\n");
   exit(0);
  }
//fwrite(arr,sizeof(struct student)*n,n,fp);
    
    int i;
      
  for (i=0;i<n;i++)
  {
 
   fprintf(fp,"%s %s %c %d %s\n",arr[i].name,arr[i].num,arr[i].sex,arr[i].age,arr[i].note);
  }
  fclose(fp);

}

void Modify(struct student* arr,int n)//学生基本信息修改
{
char number[10];
int temp;
bool flag=false;
char pass[6];
printf("请输入密码:\n");
scanf("%s",pass);
if (Check(pass))
{
printf("---------------1-修改学号-----------\n"
       "---------------2-修改姓名-----------\n"
       "---------------3-修改性别-----------\n"
       "---------------4-修改年龄-----------\n"
       "---------------5-退出 ---------\n");
scanf("%d",&temp);
switch(temp)
{
case 1://修改学号
{
printf("修改学生信息:\n");
printf("请输入学号:\n");
scanf("%s",number);
for (int i =0;i<n;i++)
{
   if (!strcmp(number,arr[i].num))
  {
   printf("学生信息:姓名 学号 性别 年龄 备注 \n");
   printf("%4s%4s%4c%4d%4s\n",arr[i].name,arr[i].num,arr[i].sex,arr[i].age,arr[i].note);
   printf("重新输入该学生的学号:\n");
   scanf("%s",arr[i].num);
   Save(arr,n);
   flag = true;
    if (flag == false)
    {  
      printf("该学生不存在!:\n");
    } 
  }
}
}
break;
case 2://修改姓名
{
printf("修改学生信息:\n");
printf("请输入学号:\n");
scanf("%s",number);
for (int i =0;i<n;i++)
{
  if (!strcmp(number,arr[i].num))
  {
   printf("学生信息:姓名 学号 性别 年龄 备注 \n");
   printf("%4s%4s%4c%4d%4s\n",arr[i].name,arr[i].num,arr[i].sex,arr[i].age,arr[i].note);
   printf("重新输入该学生的姓名:\n");
   scanf("%s",arr[i].name);
   Save(arr,n);
   flag = true;
   if (flag == false)
   {
     printf("该学生不存在!:\n");
   }  
  }
}
}
break;
case 3://修改性别
{
printf("修改学生信息:\n");
printf("请输入学号:\n");
scanf("%s",number);
for (int i =0;i<n;i++)
{
  if (!strcmp(number,arr[i].num))
  {
   printf("学生信息:姓名 学号 性别 年龄 备注 \n");
   printf("%4s%4s%4c%4d%4s\n",arr[i].name,arr[i].num,arr[i].sex,arr[i].age,arr[i].note);
   printf("重新输入该学生的性别:\n");
   scanf("%c",&arr[i].sex);
   Save(arr,n);
   flag = true;
   if (flag == false)
   {
    printf("该学生不存在!:\n");
   }
  } 
}
}
break;
case 4://修改年龄
{
printf("修改学生信息:\n");
printf("请输入学号:\n");
scanf("%s",number);
for (int i =0;i<n;i++)
{
  if (!strcmp(number,arr[i].num))
  { 
   printf("学生信息:姓名 学号 性别 年龄 备注 \n");
   printf("%4s%4s%4c%4d%4s\n",arr[i].name,arr[i].num,arr[i].sex,arr[i].age,arr[i].note);
   printf("重新输入该学生的年龄:\n");
   scanf("%d",&arr[i].age);
   Save(arr,n);
   flag = true;
   if (flag == false)
   {
   printf("该学生不存在!:\n");
   }  
  }
}
}
break;
default:
break;
}
}
}
void Delete(struct student* arr,int n)//学生基本信息删除
{
int i;
char number[10];
bool flag=false;
printf("删除学生信息:\n");
printf("请输入学号:\n");
scanf("%s",number);
for (i =0;i<n;i++)
{
   if (!strcmp(number,arr[i].num))
   {
    strcpy(arr[i].name," ");
    strcpy(arr[i].num," ");
    strcpy(arr[i].note," ");
    arr[i].sex = ' ';
    arr[i].age = 0;
    Save(arr,n);
    flag = true;
   }
}
   if (flag == true)
   { 
    printf("该学生不存在!:\n");
   }  
}
void Search(struct student* arr,int n)//学生基本信息查询
{
int temp,i;
bool flag=false;
printf("---------------1-学号查询-----------\n"
       "---------------2-姓名查询-----------\n"
       "---------------3-性别查询-----------\n"
       "---------------4-年龄查询-----------\n"
       "---------------5-退出 ---------\n");
scanf("%d",&temp);
switch (temp)
{
case 1://按照学号查询
{
char num[10];
printf("请输入学号:\n");
scanf("%s",num);
for ( i =0;i<n;i++)
{
  if (!strcmp(num,arr[i].num))
  {
   printf("%12s%12s%12c%12d%12s\n",arr[i].name,arr[i].num,
   arr[i].sex,arr[i].age,arr[i].note);
   flag = true;
  }
}
  if (!flag)
  {
   printf("该学生不存在.\n");
  }
}
break;
case 2://按照名字查询
{
char num[10];
printf("please input name:\n");
scanf("%s",num);
for ( i =0;i<n;i++)
{
  if (!strcmp(num,arr[i].name))
  {
   printf("%12s%12s%12c%12d%12s",arr[i].name,arr[i].num,
   arr[i].sex,arr[i].age,arr[i].note);
   flag = true;
  }
}
  if (!flag)
  {
   printf("该学生不存在.\n");
  }  
}
break;
case 3://按照性别查询
{
char ch;
printf("请输入性别:\n");
scanf("%c",&ch);
ch = getch();
for ( i =0;i<n;i++)
{
  if (ch == arr[i].sex)
 {
  printf("%12s%12s%12c%12d%12s\n",arr[i].name,arr[i].num,
  arr[i].sex,arr[i].age,arr[i].note);
  flag = true;
 }
}
if (!flag)
{
printf("该学生不存在:\n");
}
}
break;
case 4://按照年龄查询
{
char num_age;
printf("请输入年龄:\n");
scanf("%d",&num_age);
for ( i =0;i<n;i++)
{
  if (num_age == arr[i].age)
  { 
   printf("%12s%12s%12c%12d%12s\n",arr[i].name,arr[i].num,arr[i].sex,arr[i].age,arr[i].note);
   flag = true;
  }
}
  if (!flag)
  {
   printf("该学生不存在.\n");
  }
}
break;
default:break;
}
}
int main()
{
struct student arr[N];
char ps[6];
bool flag =false;
printf("请输入密码:\n");
scanf("%s",ps);
flag = Check(ps);
if (flag)
{
int select;
print();
scanf("%d",&select);
  while (0<select && select <7 )
  {
    switch (select)
   {
    case 1:
    Get(arr,N);
    print();
    break;
    case 2:
    Display(arr,N);
    print();
    break;
    case 3:
    Save(arr,N);
    print();
    break;
    case 4:
    Delete(arr,N);
    print();
    break;
    case 5:
    Modify(arr,N);
    print();
    break;
    case 6:
    Search(arr,N);
    print();
    break;
    default:
    break;
   }
printf("请选择:\n");
scanf("%d",&select);
  }
}
return 0;
}


img