有大神会这道C语言吗?

如题所述

第1个回答  2021-03-25

思路:

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;

}

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网