最后小新 2022-11-05 22:47 采纳率: 80%
浏览 63
已结题

求文件操作部分的代码(C语言)

#include <stdlib.h>
#include <string.h>
void Menu();
void enterdata();
void output1();
void find();
void cal();
void output2();
void output3();

int inputState;//用户输入状态
int ifexit;//是否退出系统判定
int usercnt;//用户个数

typedef struct {
char ID[10][6];
char Username[10][11];
int income[10];
int payment[10];
}Store;
Store accountdata;

int main()
{

    while(ifexit==0)
    {
    Menu();//调用菜单函数
    }
    return 0;
}

void Menu()
{
    int Usernum;//用户输入的选项
    //打印菜单
    printf("\n");
    printf("Here is the menu:\n");
    printf("1.Input record\n");
    printf("2.Sort and list records in alphabetical order by user name\n");
    printf("3.Search records by user name");
    printf("4.Calculate and list per capita income and expenses\n");
    printf("5.List records which have more expenses than per capita expenses\n");
    printf("6.List all records\n");
    printf("7.Write to a file\n");
    printf("8.Read from file\n");
    printf("0.Exit\n");
    printf("Please enter your choice:\n");
    printf("\n");
    //打印结束

    if(inputState==0)//如果用户未输入或者输入选项已被执行时要重新录入选择
    {
        printf("waiting for your choice:\n");
        inputState=1;
        scanf("%d",&Usernum);
    }


    switch (Usernum)//采用switchcase分别执行用户命令
    {

        case 1:
            enterdata();//调用录入数据函数
            inputState=0;//执行完毕,用户输入状态归零
            break;
        case 2:
            output1();
            inputState=0;//执行完毕,用户输入状态归零
            break;
        case 3:
            find();
            inputState=0;//执行完毕,用户输入状态归零
            break;
        case 4:
            cal();
            inputState=0;//执行完毕,用户输入状态归零
            break;
        case 5:
            output2();
            inputState=0;//执行完毕,用户输入状态归零
            break;
        case 6:
            output3();
            inputState=0;//执行完毕,用户输入状态归零
            break;
        case 0:
            ifexit=1;
            printf("退出系统\n");
            inputState=0;//执行完毕,用户输入状态归零
            break;
        case 7:
            WritetoFile();
            inputState=0;
            break;
        case 8:
            ReadFromFile();
            inputState=0;
            break;

        default:
            printf("请输入正确的选项\n");
            inputState=0;//执行完毕,用户输入状态归零
            break;
    } 
}

void enterdata()
{
    printf("please enter quantity of users :\n");
    scanf("%d",&usercnt);

    for(int i=0;i<usercnt;i++)//i为当前录入的用户位次下标
    {
        printf("\tID:");
        for(int j=0;j<5;j++)
        {
           scanf(" %c",&(accountdata.ID[i][j]));
        }

        printf("\tUsername:");
        int ret=0;
        while(getchar()!=10);

        int j;
        for(j=0;j<10 && ret!=10;j++)
        {
           scanf("%c",&(accountdata.Username[i][j]));
           ret=(int)accountdata.Username[i][j];
        }
        accountdata.Username[i][j-1]=0;
        ret=0;
        printf("\tincome:");
        scanf("%d",&(accountdata.income[i]));
        printf("\tpayment:");
        scanf("%d",&(accountdata.payment[i]));
        printf("\n");

    }

}
void output1()//字典序排列后输出用户记账信息
{
    for(int i=0;i<9;i++)
    {
        if(strcmp(accountdata.Username[i],accountdata.Username[i+1])>0)
        {
        char swap1[6]={"\0"};
        char swap2[11]={"\0"};
        int s1,s2;

        for(int cnt1=0;cnt1<6;cnt1++)
        {
            swap1[cnt1]=accountdata.ID[i][cnt1];
            accountdata.ID[i][cnt1]=accountdata.ID[i+1][cnt1];
            accountdata.ID[i+1][cnt1]=swap1[cnt1];
        }

        for(int cnt2=0;cnt2<10;cnt2++)
        {
            swap2[cnt2]=accountdata.Username[i][cnt2];
            accountdata.Username[i][cnt2]=accountdata.Username[i+1][cnt2];
            accountdata.Username[i+1][cnt2]=swap2[cnt2];
        }

        s1=accountdata.income[i];
       accountdata.income[i]=accountdata.income[i+1];
        accountdata.income[i+1]=s1;
        s2=accountdata.payment[i];
        accountdata.payment[i]=accountdata.payment[i+1];
        accountdata.payment[i+1]=s2;


        }
    }

    output3();

}
void find()//查找用户名打印
{
    printf("please input your target username\n");
    char tarname[11];//设置数组来存放被查找用户名
    int ret=0;//读取终止判断变量
    while(getchar()!=10);//清空缓冲区
    int i;
    for(i=0;i<10 && ret!=10;i++)//循环读入目标用户名
        {
           scanf("%c",&tarname[i]);//
           ret=(int)tarname[i];//
        }
        tarname[i-1]=0;
        ret=0;

    int jdg=1,equalnum;//设置判断变量jdg和搜索结果(原数组行下标)变量

    for(int i=0;i<10;i++)//(行循环)一行代表一个用户名
    {
        for(int j=0;j<10;j++)//单个用户名比较
        {
            if(tarname[j]!=accountdata.Username[i][j])//如果不等于
            {
                jdg=0;/eg置为代表本次不匹配
                break;
            }
        }//单个用户名比较结束

            if(jdg==1)//如果本个用户名匹配
            {
            equalnum=i;//记录行下标
            break;//跳出循环
            }
    }//匹配结束

    if(jdg==1)//匹配就打印
    {

        printf("\nHere is the data:\n");
        printf("ID:");
        for(int j=0;j<5;j++)
        {
            printf("%c",accountdata.ID[equalnum][j]);
        }
        printf("\nUsername");
        for(int j=0;j<10;j++)
        {
            printf("%c",accountdata.Username[equalnum][j]);
        }
        printf("\n");
        printf("income:%d\n",accountdata.income[equalnum]);
        printf("payment:%d\n",accountdata.payment[equalnum]);

    }
    else printf("not found!\n");//未找到输出

img

img

img


测试用例2:
输入:选择菜单项1:
请输入用户人数:5
10001 zero 6000 1500
10023 Aef 10000 3000
20011 eric001 20000 10000
20012 abcd 15000 0
30004 abc 8000 14000
测试用例9:
显示菜单
输入:选择菜单项7
输出:please input the file name:
输入:data.txt
输出:Save Successfule(同时检查文件中是否有正确内容)

测试用例10:
显示菜单
输入:选择菜单项8
输出:Please input the file name:
输入:test.txt
输出:Cannot find this file!

测试用例11:
显示菜单
输入:选择菜单项8
输出:Please input the file name:
输入:data.txt
输出:
ID UserName Income Expenses
10001 zero 6000 1500
10023 Aef 10000 3000
20011 eric001 20000 10000
20012 abcd 15000 0
30004 abc 8000 14000

  • 写回答

4条回答 默认 最新

  • 叶落花枯 2022-11-05 23:12
    关注

    写入文件的函数

    
    void WritetoFile() //将每个用户的记账系统写入文件
    {
        FILE *fp;
        char buf[100], str[20], file_name[256] = {0};
        printf("please input the file name:");
        scanf("%s", file_name);
        fp = fopen(file_name, "w");
        if(fp == NULL)
        {
            return;
        }
        for(int i=0;i<usercnt;i++)
        {
            memset(buf, 0, sizeof(buf));
            strcat(buf, accountdata.ID[i]);
            strcat(buf, "\t");
            strcat(buf, accountdata.Username[i]);
            strcat(buf, "\t");
            itoa(accountdata.income[i], str, 10);
            strcat(buf, str);
            strcat(buf, "\t");
            itoa(accountdata.payment[i], str, 10);
            strcat(buf, str);
            strcat(buf, "\n");
            fwrite(buf, 1, strlen(buf), fp);
        }
        fclose(fp);
        printf("Save Successfule\n");
    }
    

    读取文件内容并显示的函数

    
    void ReadFromFile() //读取文件中的记账信息并显示
    {
        FILE *fp;
        char *buf, file_name[256] = {0};
        int size, len, ret;
        char *p;
        char line[20][100];
        int i, count = 0;
        printf("Please input the file name:");
        scanf("%s", file_name);
        fp = fopen(file_name, "r");
        if(fp == NULL)
        {
            printf("Cannot find this file!\n");
            return;
        }
        fseek(fp, 0, SEEK_END);
        size = ftell(fp);
        fseek(fp, 0, SEEK_SET);
        buf = (char *)malloc(size + 1);
        memset(buf, 0, size + 1);
        len = 0;
        printf("ID\tUserName\tIncome\tExpenses\n");
        while(!feof(fp))
        {
            ret = fread(buf, 1, size - len, fp);
            if(ret <= 0)
            {
                break;
            }
            len += len;
        }
        // 第一种输出显示的方法,直接输出从文件中读取的内容
    //    printf("%s", buf);
    
        // 第二种输出显示的方法,将文件内容按\n和\t分割,拆分每一行、每一列
        p = strtok(buf, "\n");
        while(p)
        {
            strcpy(line[count], p); // 保存一行数据
            count++;
            p = strtok(NULL, "\n");
        }
        for(i = 0; i < count; i++)
        {
            p = strtok(line[i], "\t");
            while(p)
            {
                printf("%s", p); // 显示每一列数据
                p = strtok(NULL, "\t");
                if(p)
                {
                    printf("\t");
                }
            }
            printf("\n");
        }
        fclose(fp);
        free(buf);
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 11月14日
  • 已采纳回答 11月6日
  • 创建了问题 11月5日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分