首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言学习-构造体和文件操作

2013-03-21 
C语言学习-结构体和文件操作C语言是门经典的高级语言,只可惜大学学的不够好,工作后也没怎么用到,快把学的

C语言学习-结构体和文件操作

C语言是门经典的高级语言,只可惜大学学的不够好,工作后也没怎么用到,快把学的还给老师了,最近无聊之余,把C语言相关知识看了,编程还是在于多练和多思考,实践加学习才能领悟和找到解决问题的方法,下面是看了C语言视频后,自动动手做的一个职工信息管理系统。在C语言中读写文件,一般有一下步骤,首先用fopen函数打开文件,返回文件指针,然后用fwrite或者fread等函数进行读写,使用完后用fclose关闭。自己做该系统还是花了不少时间,主要是对结构体指针等操作以及C的一些函数不是很熟。需求如下:

C语言学习-构造体和文件操作


源码如下:

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


struct Birth
{
 int Year;
 int Month;
 int Day;
};


typedef struct WorkerInfo
{
 char WorkerNo[10];
 char Xm[10];
 char Sex[2];
 struct Birth birth;
 char Edu[18];
 char Prof[20];
 float Wage;
 char Addr[30];
 char Phone[13];
}WorkerInfo;


void ShowMain()
{
 system("CLS");
 printf("%50s\n","欢迎使用职工信息管理系统");
 printf("%30s","1显示系统进入画面"); 
 printf("%30s\n","2职工信息录入功能--输入");
 printf("%30s","3职工信息浏览功能--输出");
 printf("%20s\n","4职工信息查询");
 printf("%30s","5职工信息删除");
 printf("%20s","6职工信息修改");
 printf("\n");
};


void InputInfo()
{
FILE *fp;  
WorkerInfo *InputInfo; 
fp=fopen("WorkerInfo.dat", "a"); 
if(fp==NULL)
{
 printf("打开文件失败!");
}  
else
{
InputInfo=(WorkerInfo *)malloc(sizeof(WorkerInfo)); 
printf("请输入职工号:\n");
scanf("%s",InputInfo->WorkerNo);
   while(strcmp(InputInfo->WorkerNo,"9999")!=0)
{
printf("请输入:姓名 性别 出生年月 \n");
scanf("%s %s %4d %2d %2d",
 InputInfo->Xm,InputInfo->Sex,&InputInfo->birth.Year,
 &InputInfo->birth.Month,&InputInfo->birth.Day);
printf("请输入:学历 职务 工资 住址 电话\n");
scanf("%s %s %f %s %s",
 InputInfo->Edu,InputInfo->Prof,&InputInfo->Wage,
  InputInfo->Addr,InputInfo->Phone);
    fwrite(InputInfo,sizeof(struct WorkerInfo),1,fp);
    memset(InputInfo,0,sizeof(WorkerInfo));
    printf("请输入职工号:\n");
scanf("%s",InputInfo->WorkerNo);
    }
    if(InputInfo!=NULL)
    {
    free(InputInfo);
    InputInfo=NULL;
    }
}
fclose(fp);
};




void DisPlayInfo()
{
FILE *fp;  
WorkerInfo *CurInfo;
fp=fopen("WorkerInfo.dat", "r"); 
if(fp==NULL)
{
 printf("没有相应的职工信息!");
}    
else
{
 CurInfo=(WorkerInfo *)malloc(sizeof(WorkerInfo )); 
 printf("职工号  姓名  性别  出生年月  学历   职务   工资  住址  电话\n");
 while(!feof(fp))
 {
  memset(CurInfo,0,sizeof(WorkerInfo));
  if(fread(CurInfo,sizeof(struct WorkerInfo),1,fp)!=0)
   printf("%s %s %s %4d年%2d月%2d日 %s %s %.4f %s %s\n",
    CurInfo->WorkerNo,CurInfo->Xm,CurInfo->Sex,
    CurInfo->birth.Year,CurInfo->birth.Month,CurInfo->birth.Day,
    CurInfo->Edu,CurInfo->Prof,CurInfo->Wage,CurInfo->Addr,CurInfo->Phone);
 }
 if(CurInfo!=NULL)
 {
  free(CurInfo);
  CurInfo=NULL;
 }
 fclose(fp);
}
};


void FindResult(const int iType)
{
 FILE *fp;  
 WorkerInfo *CurInfo;
 float wage;
 char Edu[18];
 fp=fopen("WorkerInfo.dat", "r"); 
 if(iType==1)
 {
   printf("请输入工资:\n");
   scanf("%f",&wage);
 }
 else if (iType==2)
 {
   printf("请输入学历:\n");
   scanf("%s",Edu);
 }
 if(fp==NULL)
 {
  printf("没有相应的职工信息!");
 }    
 else
 {
  CurInfo=(WorkerInfo *)malloc(sizeof(WorkerInfo )); 
  printf("职工号  姓名  性别  出生年月  学历   职务   工资  住址  电话\n");
  while(!feof(fp))
  {
   memset(CurInfo,0,sizeof(WorkerInfo));
   if(fread(CurInfo,sizeof(struct WorkerInfo),1,fp)!=0)
   {
    if((iType==1)&&(fabs(CurInfo->Wage-wage)<0.0001))
{
     printf("%s %s %s %4d年%2d月%2d日 %s %s %.4f %s %s\n",
      CurInfo->WorkerNo,CurInfo->Xm,CurInfo->Sex,
      CurInfo->birth.Year,CurInfo->birth.Month,CurInfo->birth.Day,
      CurInfo->Edu,CurInfo->Prof,CurInfo->Wage,CurInfo->Addr,CurInfo->Phone);

else if((iType==2)&&(strcmp(CurInfo->Edu,Edu)==0))
{
     printf("%s %s %s %4d年%2d月%2d日 %s %s %.4f %s %s\n",
      CurInfo->WorkerNo,CurInfo->Xm,CurInfo->Sex,
      CurInfo->birth.Year,CurInfo->birth.Month,CurInfo->birth.Day,
      CurInfo->Edu,CurInfo->Prof,CurInfo->Wage,CurInfo->Addr,CurInfo->Phone);
}
   }
  }
 if(CurInfo!=NULL)
 {
  free(CurInfo);
  CurInfo=NULL;
 }
  fclose(fp);
}
}


void QueryInfo()
{
  int i;
  printf("请输入查询方式序号:\n");
  printf("1按工资查询\n");
  printf("2按学历查询\n");
  scanf("%d",&i);
  switch(i)
  {
  case 1:FindResult(1);break;
  case 2:FindResult(2);break;
  default:
   printf("错误的查询序号\n");  
  }
};


void DeleteInfo()
{
 char sno[10];
 FILE *fp,*fp2;  
 WorkerInfo *CurInfo;
 printf("请输入要删除的职工编号");
 scanf("%s",sno);
 fp=fopen("WorkerInfo.dat", "r"); 
 fp2=fopen("WorkerInfo1.dat","w");
 if(fp==NULL)
 {
  printf("没有相应的职工信息!");
 }    
 else
 {
 CurInfo=(WorkerInfo *)malloc(sizeof(WorkerInfo ));
  while(!feof(fp))
 {
  memset(CurInfo,0,sizeof(WorkerInfo));
  if((fread(CurInfo,sizeof(struct WorkerInfo),1,fp)!=0)&&(strcmp(CurInfo->WorkerNo,sno)!=0))
  {
    fwrite(CurInfo,sizeof(struct WorkerInfo),1,fp2);
  }
 }
 if(CurInfo!=NULL)
 {
  free(CurInfo);
  CurInfo=NULL;
 }
 fclose(fp2);
 fclose(fp);
 }
 remove("WorkerInfo.dat");
 rename("WorkerInfo1.dat","WorkerInfo.dat");
};


void UpdateInfo()
{
 char sno[10];
 FILE *fp,*fp2;  
 WorkerInfo *CurInfo;
 WorkerInfo InputInfo;
 printf("请输入要修改的:职工号 姓名\n");
  scanf("%s %s",InputInfo.WorkerNo,InputInfo.Xm);
 printf("请输入:学历 职务 工资 住址 电话\n");
    scanf("%s %s %f %s %s",
 InputInfo.Edu,InputInfo.Prof,&InputInfo.Wage,
  InputInfo.Addr,InputInfo.Phone);
 fp=fopen("WorkerInfo.dat", "r"); 
 fp2=fopen("WorkerInfo1.dat","w");
 if(fp==NULL)
 {
  printf("没有相应的职工信息!");
 }    
 else
 {
  CurInfo=(WorkerInfo *)malloc(sizeof(WorkerInfo )); 
  while(!feof(fp))
 {
  memset(CurInfo,0,sizeof(WorkerInfo));
  if(fread(CurInfo,sizeof(struct WorkerInfo),1,fp)!=0)
  { if(strcmp(CurInfo->WorkerNo,InputInfo.WorkerNo)!=0)
     fwrite(CurInfo,sizeof(struct WorkerInfo),1,fp2);
    else
    {
     strcpy(CurInfo->Xm,InputInfo.Xm);
     strcpy(CurInfo->Edu,InputInfo.Edu);
     strcpy(CurInfo->Prof,InputInfo.Prof);
     CurInfo->Wage=InputInfo.Wage;
     strcpy(CurInfo->Addr,InputInfo.Addr);
     strcpy(CurInfo->Phone,InputInfo.Phone);
     fwrite(CurInfo,sizeof(struct WorkerInfo),1,fp2);
    }
  }
 }
 if(CurInfo!=NULL)
 {
   free(CurInfo);
   CurInfo=NULL;
 }
 fclose(fp);
 fclose(fp2);
 }
 remove("WorkerInfo.dat");
 rename("WorkerInfo1.dat","WorkerInfo.dat");
};


void main(int argc,char *argv)
{
  int i;
  ShowMain();
  printf("请输入功能序号");
  scanf("%d",&i);
  while(i!=10)
  {
  switch(i)
  {
   case 1:ShowMain();break;
   case 2:InputInfo();break;
   case 3:DisPlayInfo();break;
   case 4:QueryInfo();break;
   case 5:DeleteInfo();break;
   case 6:UpdateInfo();break;
   default:
    printf("输入错误,请重新输入。\n");
  }
  system("PAUSE");
  ShowMain();
  printf("请输入功能序号");
  scanf("%d",&i);
  };
}

运行部分结果如下:

C语言学习-构造体和文件操作

C语言学习-构造体和文件操作

C语言学习-构造体和文件操作

C语言我还是菜鸟,功能实现了,但肯定有不少问题,再慢慢折腾吧。希望有更多人指导。

热点排行