当前位置: 首页 > 知识库问答 >
问题:

c - C语言添加药品信息模块添加内容进去和文件格式不符,并且为什么再次打开文件里面内容是乱的?

上官和惬
2023-09-06
#include <stdio.h>#include <stdlib.h>#include <string.h>#define MEDICINE_FILE "medicine.txt" //药品文件名typedef struct medicine{    char drug_name[100]; //药品名    int drug_number;     //药品编号    float price;           //售价    int num;             //药品剩余数量} medicine;struct med{    medicine medicine_array[500]; //存放药品的数组    int size;                     //数组已使用的大小} med;//与药品操作相关函数void showMenu();                //打印菜单void read_medicine_file();      //从文件中读入药品信息void add_medicine();            //添加药品信息void show_medicine();           //查看所有药品信息void drug_name_del();           //按名称删除药品信息void drug_number_revise();      //按编号修改药品信息int drug_number_find(int num);  //按编号查找药品信息,返回下标void show_drug_number_find();   //输出查找到的药品信息int drug_name_find(char *name); //按姓名查找药品信息,返回下标void show_drug_name_find();     //按姓名查找药品信息,并将药品信息输出void save_medicine();           //保存药品信息到文件int main(int argc, char *argv[]){    int select = 15;    read_medicine_file(); //读取文件中药品的信息    while (1)    {        showMenu(); //打印菜单        while (scanf("%d", &select) != 1 || select < 0 || select > 10)        {            printf("输入有误,请重新输入\n");            scanf("%*[^\n]%*c"); //将输入缓冲中所有数据丢弃        }        switch (select)        {        case 0:            //退出程序            exit(0);            break;        case 1:            //添加药品信息            add_medicine();            break;        case 2:            //查看所有药品信息            show_medicine();            break;        case 3:            //按名称删除药品信息            drug_name_del();            break;        case 4:            //按编号修改药品信息            drug_number_revise();            break;        case 5:            //按编号查找药品信息,并将药品信息输出            show_drug_number_find();            break;        case 6:            //按名称查找药品信息,并将药品信息输出            show_drug_name_find();            break;        }    }    return 0;}//打印菜单void showMenu(){    printf("-----------欢迎来到药房管理系统------------\n");    printf("-------------------------------------------\n");    printf("请输入你要选择的编号:\n");    printf("1、添加药品信息\n");    printf("2、查看所有药品信息\n");    printf("3、按名称删除药品信息\n");    printf("4、按编号修改药品信息\n");    printf("5、按编号查找药品信息\n");    printf("6、按姓名查找药品信息\n");    printf("0、退出本系统\n");    printf("-------------------------------------------\n");}//从文件中读入药品信息void read_medicine_file(){    FILE *fp = fopen(MEDICINE_FILE, "r");    if (fp == NULL)    {        med.size = 0;        memset(&med.medicine_array, 0, sizeof(med.medicine_array));    }    else    {        while (fscanf(fp, "%s\t\t\t%d\t\t\t%f\t\t\t%d", med.medicine_array[med.size].drug_name,                      &med.medicine_array[med.size].drug_number,                      &med.medicine_array[med.size].price,                      &med.medicine_array[med.size].num) != EOF)        {            med.size++;        }    }    fclose(fp);}//添加药品信息void add_medicine(){    int flag = 0;    int num; //保存编号用于去重    printf("请输入你要添加的药品的数量\n");    int n, i;    while (scanf("%d", &n) != 1 || n < 0)    {        printf("输入有误,请重新输入\n");        scanf("%*[^\n]%*c");    }    for (i = 0; i < n; ++i)    {        printf("第%d个药品的信息\n", i + 1);        printf("--------------------\n");        printf("请输入药品姓名\n");        scanf("%s", med.medicine_array[med.size].drug_name);        printf("请输入药品编号\n");        med.medicine_array[med.size].drug_number = 0;        do        {            while (scanf("%d", &num) != 1)            {                printf("输入有误,请重新输入!\n");                scanf("%*[^\n]%*c");            }            int ret = drug_number_find(num);            if (ret != -1)            {                printf("该编号已经存在,请重新输入\n");            }            else            {                med.medicine_array[med.size].drug_number = num;                break;            }        } while (1);        printf("请输入药品售价\n");        while (scanf("%f", &med.medicine_array[med.size].price) != 1)        {            printf("输入有误,请重新输入!\n");            scanf("%*[^\n]%*c");        }        printf("请输入药品数量\n");        while (scanf("%d", &med.medicine_array[med.size].num) != 1)        {            printf("输入有误,请重新输入!\n");            scanf("%*[^\n]%*c");        }        flag = 1;        med.size++;    }    if (flag == 1)        save_medicine(); //保存到文件}//查看所有药品信息void show_medicine(){    printf("药品名称\t\t\t编号\t\t\t单价\t\t\t库存数量\n");    int i;    for (i = 0; i < med.size; ++i)    {        printf("%s\t\t\t%d\t\t\t%.1f\t\t\t%d\n", med.medicine_array[i].drug_name,               med.medicine_array[i].drug_number,               med.medicine_array[i].price,               med.medicine_array[i].num);    }}//按姓名删除药品信息void drug_name_del(){    int flag = 0;    int i, j, n;    char name[100];    printf("请输入你要删除的药品数量\n");    while (scanf("%d", &n) != 1 || n < 0)    {        printf("输入有误,请重新输入\n");        scanf("%*[^\n]%*c");    }    for (i = 0; i < n; ++i)    {        printf("第%d个药品的姓名\n", i + 1);        printf("--------------------\n");        printf("请输入要删除的药品姓名\n");        scanf("%s", name);        int ret = drug_name_find(name);        if (ret != -1)        {            flag = 1;            printf("删除成功,删除的信息为\n");            printf("%s\t\t\t%d\t\t\t%.1f\t\t\t%d\n", med.medicine_array[ret].drug_name,                   med.medicine_array[ret].drug_number,                   med.medicine_array[ret].price,                   med.medicine_array[ret].num);            for (j = ret; j < med.size - 1; j++)            {                med.medicine_array[j] = med.medicine_array[j + 1];            }            med.size--;        }        else        {            printf("未找到该药品,删除失败\n");        }    }    if (flag == 1)        save_medicine();}//按编号修改药品信息void drug_number_revise(){    int flag = 0;    int i, j, n, number; //保存要修改的编号    int num;             //保存新编号,用于去重    printf("请输入你要修改的药品数量\n");    while (scanf("%d", &n) != 1 || n < 0)    {        printf("输入有误,请重新输入\n");        scanf("%*[^\n]%*c");    }    for (i = 0; i < n; ++i)    {        printf("第%d个药品的编号\n", i + 1);        printf("--------------------\n");        printf("请输入要修改的药品编号\n");        while (scanf("%d", &number) != 1)        {            printf("输入有误,请重新输入\n");            scanf("%*[^\n]%*c");        }        int ret = drug_number_find(number);        if (ret != -1)        {            flag = 1;            printf("找到该编号的药品,该药品信息为\n");            printf("%s\t\t\t%d\t\t\t%.1f\t\t\t%d\n", med.medicine_array[ret].drug_name,                   med.medicine_array[ret].drug_number,                   med.medicine_array[ret].price,                   med.medicine_array[ret].num);            printf("请输入新信息\n");            printf("请输入药品新姓名\n");            scanf("%s", med.medicine_array[ret].drug_name);            printf("请输入药品编号\n");            med.medicine_array[ret].drug_number = -1; //将该药品编号改为-1防止新输入的编号和当前编号相同,导致无法成功输入该编号            do            {                while (scanf("%d", &num) != 1)                {                    printf("输入有误,请重新输入!\n");                    scanf("%*[^\n]%*c");                }                int res = drug_number_find(num);                if (res != -1)                {                    printf("该编号已经存在,请重新输入\n");                }                else                {                    med.medicine_array[ret].drug_number = num;                    break;                }            } while (1);            printf("请输入药品售价\n");            while (scanf("%f", &med.medicine_array[ret].price) != 1)            {                printf("输入有误,请重新输入!\n");                scanf("%*[^\n]%*c");            }            printf("请输入药品数量\n");            while (scanf("%d", &med.medicine_array[ret].num) != 1)            {                printf("输入有误,请重新输入!\n");                scanf("%*[^\n]%*c");            }            printf("修改成功!\n");        }        else        {            printf("未找到该编号的药品\n");        }    }    if (flag == 1)        save_medicine();}//按编号查找药品信息,返回下标int drug_number_find(int number){    int i;    for (i = 0; i < med.size; ++i)    {        if (number == med.medicine_array[i].drug_number)        {            return i;        }    }    return -1;}//输出查找到的药品信息void show_drug_number_find(){    int number;    printf("请输入要查找的编号编号\n");    while (scanf("%d", &number) != 1)    {        printf("输入有误,请重新输入\n");        scanf("%*[^\n]%*c");    }    int ret = drug_number_find(number);    if (ret == -1)    {        printf("未找到\n");    }    else    {        printf("找到了,信息为\n");        printf("%s\t\t\t%d\t\t\t%.1f\t\t\t%d\n", med.medicine_array[ret].drug_name,               med.medicine_array[ret].drug_number,               med.medicine_array[ret].price,               med.medicine_array[ret].num);    }}//按姓名查找药品信息int drug_name_find(char *name){    int i;    for (i = 0; i < med.size; ++i)    {        if (strcmp(name, med.medicine_array[i].drug_name) == 0)            return i;    }    return -1;}//按姓名查找药品信息,并将药品信息输出void show_drug_name_find(){    char name[100];    printf("请输入你要查找的药品姓名\n");    scanf("%s", name);    int ret = drug_name_find(name);    if (ret == -1)    {        printf("未找到\n");    }    else    {        printf("找到了,药品信息为\n");        printf("%s\t\t\t%d\t\t\t%.1f\t\t\t%d\n", med.medicine_array[ret].drug_name,               med.medicine_array[ret].drug_number,               med.medicine_array[ret].price,               med.medicine_array[ret].num);    }}//保存药品信息到文件void save_medicine(){    int i;    FILE *fp = fopen(MEDICINE_FILE, "w");    if (fp == NULL)    {        return;    }    for (i = 0; i < med.size; ++i)    {        fprintf(fp, "%s\t\t\t%d\t\t\t%f\t\t\t%d\n", med.medicine_array[i].drug_name,                med.medicine_array[i].drug_number,                med.medicine_array[i].price,                med.medicine_array[i].num);    }    fclose(fp);}文件999感冒灵                       1                       14.9                    200氯雷他定片                      2                       65.0                    150肠炎宁片                        3                       28.8                    150布洛芬胶囊                      4                       29.8                    230板蓝根颗粒                      5                       23.8                    300

共有1个答案

禄俊逸
2023-09-06

这位同学,你代码的这段的问题出在第35行,read_medicine_file函数的参数传递。在这个函数中,参数传递使用了指针的方式,但调用函数时并没有使用正确的指针类型,导致函数无法正确读取输入文件中的内容。
指针类型搞错了,在read_medicine_file函数中,参数传递使用的是char *类型的指针,但输入文件的格式是整型或双精度浮点数类型的数据,需要使用int或float类型的指针来传递数据,才能确保数据的正确性。修改一下就可以正常运行了。

 类似资料:
  • 我想知道什么是最好的方法是转换一个ODT文件到一个PDF同时也添加内容到该文件。 null

  • 本文向大家介绍C语言文件打开的模式,包括了C语言文件打开的模式的使用技巧和注意事项,需要的朋友参考一下 1、文件分为ASCII文件和二进制文件,ASCII文件也称文本文件,由一系列字符组成,文件中存储的是每个字符的ASCII码值。 2、FILE *fp; FILE是文件类型标识符,是C编译系统定义好的一个结构体类型,结构体中含有文件名、文件状态等信息。 其定义一个指针变量fp,该变量用于指向一个文

  • 本文向大家介绍C#实现向指定文本文件添加内容的方法,包括了C#实现向指定文本文件添加内容的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现向指定文本文件添加内容的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 主要内容:fopen() 函数的返回值,fopen() 函数的打开方式,关闭文件,实例演示在C语言中,操作文件之前必须先打开文件;所谓“打开文件”,就是让程序和文件建立连接的过程。 打开文件之后,程序可以得到文件的相关信息,例如大小、类型、权限、创建者、更新时间等。在后续读写文件的过程中,程序还可以记录当前读写到了哪个位置,下次可以在此基础上继续操作。 标准输入文件 stdin(表示键盘)、标准输出文件 stdout(表示显示器)、标准错误文件 stderr(表示显示器)是由系统打开的

  • 问题内容: 我本周刚开始使用AngularJS进行一个新项目,所以我必须尽快加快速度。 我的要求之一是动态添加html内容,并且该内容可能带有click事件。 因此,我在下面的代码Angular代码中显示了一个按钮,当单击该按钮时,它会动态添加另一个按钮。单击动态添加的按钮,应该添加另一个按钮,但是我无法让ng- click来处理动态添加的按钮 工作代码示例在此处 http://plnkr.co/