有大神会这道C语言吗?

 我来答
自我编程
2021-03-25 · 科技优质答主
自我编程
采纳数:1488 获赞数:4264

向TA提问 私信TA
展开全部

思路:

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;

}

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式