如题所述
思路:
1、结构数组初始化在initEMPS函数,通过随机数填充,如需手动输入,请在该函数下修改。
2、在fopen函数打开文件流时传递对应格式参数。
3、读写分别对应fscanf和fprintf两个函数。
4、将读和写分别封装成两个独立函数,通过传递参数fmod,实现二进制读写和文本读写。
下面是演示代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define M 3//员工数量
#define S 20//姓名数组长度
#define P "c:\\emps"//默认路径包含文件,不包含文件后缀
typedef struct employees
{
char name[S];
int num;
int age;
struct tm time;
int salary;
}EMPS;
EMPS* initEMPS();
void showEMPS(EMPS *pEmps);
int write2FileByM(EMPS *pEmps,int fmode);//按照格式fmode写入文件,fmode=0:二进制读写。fmode=1:文本文件读写。成功返回1,失败返回0
EMPS *readFFileByM(EMPS *pEmps,int fmode);//按照格式fmode从文件读取,fmode=0:二进制读写。fmode=1:文本文件读写。成功返回数组,失败返回NULL
int main()
{
srand(time(NULL));
EMPS *pEmps=NULL;
pEmps=initEMPS();
printf("按照二进制写入文件:(默认路径:%s.dat)\n",P);
if(!write2FileByM(pEmps,0))return 1;
printf("按照二进制读取文件内容为:\n");
if(!readFFileByM(pEmps,0))return 1;
showEMPS(pEmps);
printf("\n***************************************\n");
printf("按照文本格式写入文件:(默认路径:%s.txt)\n",P);
if(!write2FileByM(pEmps,1))return 1;
printf("按照文本格式读取文件内容为:\n");
if(!readFFileByM(pEmps,1))return 1;
showEMPS(pEmps);
return 0;
}
void showEMPS(EMPS *pEmps)
{
int i;
for(i=0;i<M;i++)
{
printf("===============================================\n");
printf("姓 名:%s\n",pEmps[i].name);
printf("编 号:%d\n",pEmps[i].num);
printf("年 龄:%d\n",pEmps[i].age);
printf("入职时间:%d-%d-%d\n",pEmps[i].time.tm_year,pEmps[i].time.tm_mon,pEmps[i].time.tm_mday);
printf("工 资:%d\n",pEmps[i].salary);
printf("===============================================\n\n");
}
}
EMPS* initEMPS()
{
int i;
static EMPS empss[M];
for(i=0;i<M;i++)
{
sprintf(empss[i].name,"员工%d",i+1);
empss[i].num=rand()%1000;
empss[i].age=rand()%20+20;
empss[i].time.tm_year=2021-empss[i].age+18;
empss[i].time.tm_mon=rand()%12+1;
empss[i].time.tm_mday=rand()%28+1;
empss[i].time.tm_hour=0;
empss[i].time.tm_min=0;
empss[i].time.tm_sec=0;
empss[i].time.tm_isdst=0;
empss[i].salary=(empss[i].age-18)*100+2000;
}
return (EMPS*)empss;
}
int write2FileByM(EMPS *pEmps,int fmode)
{
int i;
char s_Mode[4],path[100];
FILE *fp=NULL;
if(fmode!=0 && fmode!=1){printf("write2FileByB ERROR 00!\n");return 0;}
if(!pEmps){printf("write2FileByB ERROR 01!\n");return 0;}
switch(fmode)
{
case 0:sprintf(s_Mode,"wb+");break;
case 1:sprintf(s_Mode,"wt+");break;
}
sprintf(path,"%s.%s",P,fmode?"txt":"dat");
if(!(fp=fopen(path,s_Mode))) {printf("write2FileByB ERROR 02!\n");return 0;}
fseek(fp,0,SEEK_SET);
for(i=0;i<M;i++)
fprintf(fp,"%s %d %d %d-%d-%d %d\r\n",pEmps[i].name,pEmps[i].num,pEmps[i].age,pEmps[i].time.tm_year,pEmps[i].time.tm_mon,pEmps[i].time.tm_mday,pEmps[i].salary);
fclose(fp);
return 1;
}
EMPS *readFFileByM(EMPS *pEmps,int fmode)
{
int i=0,age,num,yy,mm,dd,salary;
char s_Mode[4],name[S],path[100];
FILE *fp=NULL;
if(fmode!=0 && fmode!=1){printf("readFFileByM ERROR 00!\n");return NULL;}
if(!pEmps){printf("readFFileByM ERROR 01!\n");return NULL;}
switch(fmode)
{
case 0:sprintf(s_Mode,"rb+");break;
case 1:sprintf(s_Mode,"rt+");break;
}
sprintf(path,"%s.%s",P,fmode?"txt":"dat");
if(!(fp=fopen(path,s_Mode))) {printf("readFFileByM ERROR 02!\n");return NULL;}
fseek(fp,0,SEEK_SET);
while(fscanf(fp,"%s %d %d %d-%d-%d %d\r\n",name,&num,&age,&yy,&mm,&dd,&salary)!=-1)
{
sprintf(pEmps[i].name,name);
pEmps[i].num=num;
pEmps[i].age=age;
pEmps[i].time.tm_year=yy;
pEmps[i].time.tm_mon=mm;
pEmps[i].time.tm_mday=dd;
pEmps[i].salary=salary;
i++;
}
fclose(fp);
return pEmps;
}