C 语言学生档案管理系统(源代码)

/************************************

 

本代码只供学习使用,转载收藏请注明出处,谢谢!

 

*************************************/

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

 

/*********************** 字定义函数声明 ********************************/
void Add();       //增加记录
void Delete();      //删除记录
void Search();      //查找记录
void Alter();      //修改记录
void Views();      //查看所有记录
void delete_all();      //清除所有记录
int check(char strID[]);     //查找文件记录中已经存在的学生ID


/********************* 定义学生信息结构体 **********/
struct student
{    
 //学生信息(学号,姓名,性别,籍贯,电话,住址,民族);
   char ID[10];
   char name[10];
   char sex[4];
   char nativePlace[10];
   char phone[13];
   char nation[6];
};
struct student stu;

FILE *fp;//定义文件指针

/********************* main() 主函数 *************************************/
void main()
{
 
 int flag;
 
 while(flag!=7)
 {
  printf("/n/t/t        【  请选择您所要的操作  】       /n");
  printf("/t/t‖****************************************‖/n");
  printf("/t/t‖ 1、增加记录           4、修改记录      ‖/n");
  printf("/t/t‖ 2、删除记录           5、清除所有记录  ‖/n");
  printf("/t/t‖ 3、查询记录           6、所有记录列表  ‖/n");
  printf("/t/t‖        〖  按任意键退出  〗            ‖/n");
  printf("/t/t‖****************************************‖/n");

  scanf("%d",&flag);
  switch(flag)
  {
  case 1:
   Add();   //增加记录
   getch();
   system("cls");
   break;
  case 2:
   Delete();  //删除记录
   getch();
   system("cls");
   break;
  case 3:
   Search();  //查找记录
   getch();
   system("cls");
   break;
  case 4:
   Alter();   //修改记录
   getch();
   system("cls");
   break;
  case 5:
   delete_all(); //清空所有记录
   getch();
   system("cls");
   break;
  case 6:
   Views();   //查看所有记录
   getch();
   system("cls");
   break;
  default:
   exit(0);
  }
 }  
}


/***************** 插入新记录 *******************************/
void Add() 

 if((fp=fopen("StudentMessage","ab+"))==NULL)
 {
  printf("学生信息文件打开失败!");
  exit(1);
 }
 else
 {
  int check_add(char stuID[]);
  long flength,offset;
  int k=0,t;        //t用来接收check()函数的传值
  char str[53];
  fseek(fp,0,SEEK_END);
  flength=ftell(fp)/sizeof(stu);  //统计文件中有多少条记录
  
  printf("/t请输入要插入的学生的信息:/n");
input_message:
  printf("/t学号:");
  scanf("%s",&stu.ID);
  t=check_add(stu.ID); 
  if(t==1)
  {
   printf("/t》 该学号已经存在,不允许重复插入!请重新输入一个学号。《/n");
   goto input_message;  //跳转到“input_message”标记处继续执行
  }
  printf("/t姓名:");
  scanf("%s",&stu.name);
  printf("/t性别:");
  scanf("%s",&stu.sex);
  printf("/t籍贯:");
  scanf("%s",&stu.nation);
  printf("/t电话:");
  scanf("%s",&stu.phone);
  printf("/t名族:");
  scanf("%s",&stu.nativePlace);

  rewind(fp);
  
  //检测文件中是否有空字符串,如果有则在此处插入新记录,如果没有则插入到文件尾
  while(!feof(fp))
  {
   fread(&str,sizeof(stu),1,fp);
   
   //检测到空字符串,则将fp所指向的文件关闭,以读写方式重新打开
   if(strcmp(str,"")==0)
   {
    fclose(fp);
    fp=fopen("StudentMessage","rb+");
    break;
   }
   k++;
  }  
  offset=sizeof(stu)*k;
  fseek(fp,offset,SEEK_SET);
  fwrite(&stu,sizeof(stu),1,fp);
  fclose(fp);
  printf("插入数据成功!/n");
 }
}


/****************** 检测将要插入的学号是否已存在文件记录中 **************************/
int check(char stuID[10])
{
 int id=0,k=1;
 FILE *fpp;
 struct student checkID;
 if((fpp=fopen("StudentMessage","rb"))==NULL) //以只读方式打开一个二进制文件StudentMessage
 {
  printf("文件打开失败!/n");
  exit(1);//打开失败,返回系统
 }
 while(!feof(fpp))
 {
  fread(&checkID,sizeof(stu),1,fpp);
  
  //检测用户输入的学号是否已经存在,若存在则终止程序的执行
  if(strcmp(checkID.ID,stuID)==0)
  {  
            break;
  }
  id++;
  
 }
 fclose(fpp);
 return id*k;
}

/********************  检测输入的学号是否能插入 *****************************************/
int check_add(char stuID[10])
{
 int id;
 FILE *fpp;
 struct student checkID;
 if((fpp=fopen("StudentMessage","rb"))==NULL) //以只读方式打开一个二进制文件StudentMessage
 {
  printf("文件打开失败!/n");
  exit(1);//打开失败,返回系统
 }
 while(!feof(fpp))
 {
  fread(&checkID,sizeof(stu),1,fpp);
  
  //检测用户输入的学号是否已经存在,若存在则终止程序的执行
  if(strcmp(checkID.ID,stuID)==0)
  {  
      id=1;
          break;
  }
  else
  {
   id=0;
  }
  
 }
 fclose(fpp);
 return id;
}


/******************* 根据用户输入的学号删除记录 ************/
void Delete()    

 printf("删除相应记录!/n");
 if((fp=fopen("StudentMessage","rb+"))==NULL) //以可读可写方式打开一个二进制文件
 {
  printf("文件打开失败!/n");
  return;
 }
 else
 {
  char message[10];         //接收用户需要删除的学号
  int i;
  long flength;
  
  fseek(fp,0,SEEK_END);         //把文件指针移到文件尾
  flength=ftell(fp)/sizeof(struct student); //计算文件中有多少条记录
  printf("/t请输入您要删除的学号:");
  scanf("%s",message);
  
  i=check(message);
  
  long offset=sizeof(stu)*i;      //记录要删除的学号的位置
  if(flength==0)
  {
   printf("文件记录为空!/n");
   return;
  }
     else if(i>flength)
  {
   printf("没有该学生信息!/n");
   return;
  }
  else
  {
   //将要删除的字符串全部置为空
   strcpy(stu.ID,"");
   strcpy(stu.name,"");
   strcpy(stu.sex,"");
   strcpy(stu.nation,"");
   strcpy(stu.phone,"");
   strcpy(stu.nativePlace,"");
   fseek(fp,offset,SEEK_SET);      //移动指针到要删除的学号的位置
   fwrite(&stu,sizeof(stu),1,fp);    //将置空的信息重新写回到文件中
   printf("/t/t数据删除成功!/n");
  }
  fclose(fp);
 } 
}

/****************** 查找数据 ***************************************/
void Search()
{
 if((fp=fopen("StudentMessage","rb"))==NULL) //以只读方式打开StudentMessage文件
 {
  printf("/t文件打开失败!/n");
  return;
 }
 else
 {
  char message[10];         //接收用户需要查找的信息
  int i;
  long flength,offset;
  fseek(fp,0,SEEK_END);       //将文件指针移文件尾
  flength=ftell(fp)/sizeof(struct student); //得到文件中有多少条记录
  printf("/t请输入您要查找的学号:");
  scanf("%s",message);

  i=check(message);
  
  offset=sizeof(struct student)*i;
  if(flength==0)
  {
   printf("/t文件记录为空!/n");
   return;
  }
     else if(i>flength)
  {
   printf("/t/t查找失败,没有找到相应信息!/n");
   return;
  }
  else
  {
   //输出查找到的内容
   rewind(fp);
   fseek(fp,offset,SEEK_SET);
   fread(&stu,sizeof(struct student),1,fp);
   printf("学号:%s  ",stu.ID);
   printf("姓名:%s  ",stu.name);
   printf("性别:%s  ",stu.sex);
   printf("籍贯:%s  ",stu.nation);
   printf("电话:%s  ",stu.phone);
   printf("民族:%s/n",stu.nativePlace);
  }
  fclose(fp);
 }
}


/****************** 修改记录 ********************************/
void Alter() 
{
 printf("修改相应记录!/n");
 if((fp=fopen("StudentMessage","rb+"))==NULL)
 {
  printf("文件打开失败!/n");
  exit(1);
 }
 else
 {
  char message[10];         //存储用户要修改的学号
  int i;
  long flength,offset;
  fseek(fp,0,SEEK_END);       //移动文件指针到文件尾
  flength=ftell(fp)/sizeof(struct student); //得到文件中有多少条记录
  printf("/t请输入您要修改的学号:");
  scanf("%s",message);
  i=check(message);

  offset=sizeof(struct student)*i;    //记录要修改的记录在文件中的位置

  if(flength==0)
  {
   printf("文件记录为空!/n");
   return;
  }
     else if(i>flength)
  {
   printf("没有该学生信息!/n");
   return;
  }
  else
  {
   rewind(fp);
   fseek(fp,offset,SEEK_SET);
   fread(&stu,sizeof(struct student),1,fp);

   printf("该学生原来的信息:/n");
   printf("/t学号:%s  ",stu.ID);
   printf("姓名:%s  ",stu.name);
   printf("性别:%s  ",stu.sex);
   printf("籍贯:%s  ",stu.nation);
   printf("电话:%s  ",stu.phone);
   printf("名族:%s/n/n",stu.nativePlace);

   printf("请更新该学生的信息:/n");
   strcpy(stu.ID,message);
   printf("/t姓名:");
   scanf("%s",&stu.name);
   printf("/t性别:");
   scanf("%s",&stu.sex);
   printf("/t籍贯:");
   scanf("%s",&stu.nation);
   printf("/t电话:");
   scanf("%s",&stu.phone);
   printf("/t名族:");
   scanf("%s",&stu.nativePlace);
   
   fseek(fp,offset,SEEK_SET);      //将文件指针指向要修改的地方
   fwrite(&stu,sizeof(stu),1,fp);   //将修改后的内容重新写回到原来的地方

   printf("/t数据更新成功!/n");
  }
  fclose(fp);
 }
}

/************** 查看所有记录 ************************************/
void Views() 
{
 long flength;
 
 if((fp=fopen("StudentMessage","rb"))==NULL)
 {
  printf("文件打开失败!/n");
  exit(1);
 }

 fseek(fp,0,SEEK_END);         //移动文件指针到文件尾
 flength=ftell(fp)/sizeof(struct student); //得到文件中有多少条记录
 if(flength==0)
 {
  printf("文件中没有记录!");
  return;
 }

 rewind(fp);            //将文件指针移动到文件头
 
 printf("/t/t/t所有记录列表/n/n");
 
 while(!feof(fp))
 {
  fread(&stu,sizeof(stu),1,fp);
  if(strcmp(stu.ID,"")!=0)     //检测文件中的空字符串,如果不是空字符串则输出
  {
   printf("学号:%s  ",stu.ID);
   printf("姓名:%s  ",stu.name);
   printf("性别:%s  ",stu.sex);
   printf("籍贯:%s  ",stu.nation);
   printf("电话:%s  ",stu.phone);
   printf("民族:%s/n",stu.nativePlace);
  }
 }
 
 fclose(fp);
}

/******************** 删除所有记录 ********************************/
void delete_all()
{
 int ch;
 printf("该操作将删除所有记录,按“0”退出,按“1”继续。/n");
 scanf("%d",&ch);
 switch(ch)
 {
 case 0:
  break;
 case 1:
  printf("将删除所有记录,继续请按“1”,退出请按“0”。/n");
  scanf("%d",&ch);
  switch(ch)
  {
  case 0:
   break;
  case 1:
   if (remove("StudentMessage") == 0)  //删除StudentMessage文件
   {
    printf("操作成功,所有记录已经删除!");
   }
   else
   {
    perror("remove");       //如果删除不成功则输出系统出错的信息
   }
   break;
  }  
 }
}

  

  • 8
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值