可以交流并修改一下代码吗?运行后有不少问题

1.in函数里数据输入后文字可以在txt文件里正常显示,但是数字不行
2.delet update select 函数中无法在txt文件里找到对应学号
3.print函数中输出所有数据时总会多输出几遍,而且会多一些奇奇怪怪的东西。

- #include <stdio.h>
#include<string.h>
#include <stdlib.h> 
#define LEN sizeof(struct student)
//学生信息结构体 
struct student
{int num;
 char name[10];
 char clas[10];
 char sex[8];
 float Eng_score;
 float C_score;
};
struct student stu[50];
//系统操作 

void menu()
{
  printf("\n\n\n");
  printf("\t\t-------------------------------------------------\n");
  printf("\t\t||              ----------------               ||\n"); 
  printf("\t\t||**************学生信息管理系统***************||\n");
  printf("\t\t||              ----------------               ||\n");
  printf("\t\t||                                             ||\n");
  printf("\t\t||~~~~~~~~~~~~~~~1.录入学生信息~~~~~~~~~~~~~~~~||\n");
  printf("\t\t||~~~~~~~~~~~~~~~2.删除学生信息~~~~~~~~~~~~~~~~||\n");
  printf("\t\t||~~~~~~~~~~~~~~~3.修改学生信息~~~~~~~~~~~~~~~~||\n");
  printf("\t\t||~~~~~~~~~~~~~~~4.查询学生信息~~~~~~~~~~~~~~~~||\n");
  printf("\t\t||~~~~~~~~~~~~~~~5.显示学生信息~~~~~~~~~~~~~~~~||\n");
  printf("\t\t||~~~~~~~~~~~~~~~6.清屏~~~~~~~~~~~~~~~~~~~~~~~~||\n");
  printf("\t\t||                                             ||\n");
  printf("\t\t||*********************************************||\n");
} 



```//录入学生信息        //数字不能正常显示
void in()                 
{
 FILE *fp;
 int i, m=0;
 char ch[2];
 if((fp=fopen("E://大二/算法/stu.txt","r"))==NULL)
 {
     printf("文件打开失败\n");
    return;
    }
 while(!feof(fp))
 {
    if(fread(&stu[m],LEN,1,fp)==1)
   {
    m++;
  }
 }
 fclose(fp);
 if(m==0)
 {
   printf("文件没有内容\n");
 }
  if((fp=fopen("E://大二/算法/stu.txt","at+"))==NULL)
   {
     printf("文件打开失败\n");
     return; 
   }
 printf("  输入学生信息(是/否);\n");
  scanf("%s",ch);
  while(strcmp(ch,"是")==0)
  {  
     printf("number:\n");
   scanf("%9d",&stu[m].num);
   for(i=0;i<m;i++)
   {
      if(stu[i].num==stu[m].num)
         {
            printf("您的信息已存在\n");
            fclose(fp); 
            getchar();
            return;
         }
   }
  printf("  name:\n");
  fflush(stdin);
  scanf("%s",stu[m].name);
  fflush(stdin);
  printf("  class:\n");
  fflush(stdin);
  scanf("%s",stu[m].clas);
  fflush(stdin);
  printf("  sex:\n");
  scanf("%s",stu[i].sex);
  fflush(stdin);
  printf("  Eng_score:\n");
  scanf("%f",&stu[m].Eng_score);
  fflush(stdin);
  printf("  C_score:\n");
  scanf("%f",&stu[m].C_score);
  fflush(stdin);
    if(fwrite(&stu[m],LEN,1,fp)!=1)
      {
         printf("不能保存\n");
         getchar(); 
      }  
    else
      {
          printf("信息保存成功\n");
          m++;
      }
   printf("是否继续录入学生信息(是/否):");
   scanf("%s",ch); 
 }
 fclose(fp);
} 

//删除学生信息 
void delet()
{   
 FILE *fp;
 int num,m=0;
 int i,j;
 int flag=0; 
 char ch[2];
 if((fp=fopen("E://大二/算法/stu.txt","rb"))==NULL)
 {
  printf("文件打开失败\n");
  return;
 }
 while(!feof(fp))
 {
  if(fread(&stu[m],LEN,1,fp)==1)
  {
   m++;
  }
 } 
 fclose(fp);
 if(m==0)
 {
  printf("文件中没有学生信息\n");
 }
 else
 {
     printf("请输入需要删除学生信息的学号:");
     scanf("%d",&num); 
 }
 for(i=0;i<m;i++)    
 {
  if(stu[i].num==num)
  {
   printf("该学生已找到,是否删除(y/n):");
   scanf("%s",ch);
   if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)
   {
    for(j=i;j<m;j++)
    {
     stu[j]=stu[j+1];
    }
     m--;
     flag=1;
    if((fp=fopen("E://大二/算法/stu.txt","wb"))==NULL)
    {
     printf("文件打开失败\n");
     return;
    }
    for(j=0;j<m;j++)
    {
     if(fwrite(&stu[j],LEN,1,fp)!=1)
     {
      printf("不能保存\n");
      getchar();
     }
    }
    fclose(fp);
    printf("删除成功!\n");break;
    
   }
   else
   {
      printf("学生信息存在,不需要删除。");
      break; 
      }
  }
    
 }
 if(m==i&&flag==0) 
 {
  printf("未找到该学生"); 
 }
 
}

//修改学生信息 
void updet()
{
 int num;
 char name[10]; 
    char clas[20];
    char sex[5];
    float Eng_score;
    float C_score; 
 FILE *fp;
 int m=0,a;
 int i,j;
 if((fp=fopen("E://大二/算法/stu.txt","rb"))==NULL)
 {
  printf("文件打开失败\n");
  return;
 }
 while(!feof(fp))
 {
  if(fread(&stu[m],LEN,1,fp)==1)
  {
   m++;
  }
 }
 fclose(fp);
 if(m==0)
 {
  printf("文件中没有学生信息\n");
 } 
 else
 {
  //print();
   printf("请输入需要修改学生信息的学号:");
   scanf("%d",&num); 
 }
 for(i=0;i<m;i++)
 {
   if(num==stu[i].num)
   {
       printf("1:学号,2:姓名,3:班级,4:性别,5:英语成绩,6:C语言成绩\n");
    printf("该学生已被找到,请选择需要修改的内容(1-5):");    
    scanf("%d",&a);
    while(a)
    {    
     switch (a) 
     {
      
      case 1:
       printf("将%d学生的学号修改为:",num); 
       scanf("%d",&num);
     stu[i].num=num;
     for(j=i+1;j<m;j++)
     {
      if(stu[j].num==num)
      {
       printf("您修改的学号已存在\n");
       getchar();
       return;
      }
     }   
       break;
      case 2:
       printf("将%d学生的姓名修改为:",num); 
       scanf("%s",name);
       strcpy(stu[i].name,name);
       break; 
      case 3:
       printf("将%d学生的班级修改为:",num); 
       scanf("%s",clas);
       strcpy(stu[i].clas,clas);
       break;
      case 4:
       printf("将%d学生的性别修改为:",num); 
       scanf("%s",sex);
     strcpy(stu[i].sex,sex);   
       break;
    case 5:
       printf("将%d学生的英语成绩修改为:",num); 
       scanf("%f",&Eng_score);
       stu[i].Eng_score=Eng_score;
       break;
    case 6:
       printf("将%d学生的C语言成绩修改为:",num);
     scanf("%f",&C_score);
     stu[i].C_score=C_score;
       break;          
      default:
          printf("选择错误,请重新选择需要修改的内容:");
     scanf("%d",&a);   
       break;
       }
     
     printf("请选择需要修改的内容(如果已修改完成请按0):");
     scanf("%d",&a);
      }
   if((fp=fopen("stu.txt","wb"))==NULL)
    {
     printf("文件打开失败\n");
     return;
    }
    for(j=0;j<m;j++)
    {
     if(fwrite(&stu[j],LEN,1,fp)!=1)
     {
      printf("不能保存\n");
      getchar();
     }
    }
    fclose(fp);
    printf("修改成功!\n");
    break;   
     }
    }
    if(m==i)
    {
       printf("未找到该学生\n"); 
 }
}

//查询学生信息 
void select()
{
 int num,m=0;
 int i;
 FILE *fp;
 if((fp=fopen("E://大二/算法/stu.txt","rt+"))==NULL)
 {
  printf("文件打开失败\n");
  return;
 }
 while(!feof(fp))
 {
  if(fread(&stu[m],LEN,1,fp)==1)
  {
    m++;
     }
  } 
 fclose(fp);
 if(m==0)
 {
  printf("文件没有内容\n");
  return;
 }  
 printf("请输入学生学号进行查询:");
 scanf("%d",&num);
 for(i=0;i<m;i++)
 {
  if(num==stu[i].num)
  {
   printf("\n");
   printf("该学生信息已被查到;\n");
   printf("学号\t姓名\t班级\t性别\t英语成绩\tC语言成绩\t\n");
   printf("%3d\t%s\t%s\t%s\t%.2f\t\t%.2f\t\t\n",stu[i].num,stu[i].name,stu[i].clas,stu[i].sex,stu[i].Eng_score,stu[i].C_score); 
   break; 
  }  
 }
 if(m==i)
 {
  printf("该学生信息不存在\n");
  return;
 }  
}

//显示学生信息 
void print()
{ 
  int i,m=0;
  FILE *fp;
  if((fp=fopen("E://大二/算法/stu.txt","rt"))==NULL)
  {
   printf("文件打开失败\n");
   return; 
  }
    while(!feof(fp))
 {
  if(fread(&stu[m],LEN,1,fp)==1)
   {
   m++;
   }                                //得出txt中信息行数
 }
  fclose(fp);
  if(m==0)
  {
   printf("文件中没有内容\n");
  }
  else
  {
   printf("学号\t姓名\t班级\t性别\t英语成绩\tC语言成绩\n");  
   for(i=0;i<m;i++)
   {
     printf("%3d\t%s\t%s\t%s\t%.2f\t\t%.2f\t\n",stu[i].num,stu[i].name,stu[i].clas,stu[i].sex,stu[i].Eng_score,stu[i].C_score);
    }
  }
}
//清屏
 void clea()
 {
  system("cls");
 } 
int main()
{
 menu();
 int n;
 printf("请选择功能(1-6):\n"); 
 scanf("%d",&n);
 while(n)
 { 
  if(n>=1&&n<=9)
  { 
   switch(n)
   {
     case 1:in();break;
     case 2:delet();break; 
     case 3:updet();break; 
     case 4:select();break; 
     case 5:print();break;
     case 6:clea();break;     
   }
   if(n==6)
   {
    menu();
   } 
      printf("\n");
      printf("请选择功能(1-6):"); 
      scanf("%d",&n);
     }
   else 
   {
    printf("\n"); 
    printf("请重新输入:");
      scanf("%d",&n);
   }
 }
  return 0;
}

不能直接取结构体的地址作为数据写入文件,写入文件都是要以字符串形式才可以。

char buf[100] = {0};
sprintf(buf, "%d\t%s\t%s\t%s\t%f\t%f\n", stu[m].num, stu[m].name, stu[m].clas, stu[m].sex, stu[m].Eng_score, stu[m].C_score); //按格式拼接一行数据
fwrite(&buf,strlen(buf),1,fp); //写入文件

如果按照上面的固定每行格式写入文件,读取的时候也就可以根据对应的格式进行读出来就可以了。

struct student stu;
int ret = fscanf(fp, "%d\t%s\t%s\t%s\t%f\t%f\n", &stu.num, stu.name, stu.clas, stu.sex, &stu.Eng_score, &stu.C_score); //按每行的固定格式读取
if(ret == 6) { //一行总共6个数据
    printf("%d\t%s\t%s\t%s\t%f\t%f\n", stu.num, stu.name, stu.clas, stu.sex, stu.Eng_score, stu.C_score); //打印输出
    //......
}