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

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 %d %f %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(){    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 %d %f %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.0    150布洛芬胶囊    4    29.8    230板蓝根颗粒    5    23.8    300

共有1个答案

蔡辰钊
2023-09-06

因为你添加药品信息模块后,再次打开文件会改变文件内容。这是因为在添加药品信息时,可能修改了文件中已有的数据。例如,如果药品编号为100的药品已经存在,但添加新药品时将编号设为101,所以文件内容就会发生变化。

如果你想要避免这种情况,可以在添加药品信息时,先读取文件内容,检查文件中是否有该药品信息,如果有,则更新药品信息;如果没有,则创建新的药品信息。这样可以保证文件内容与添加的药品信息一致。(这其实也是一般的大学c语言课程项目中的代码数据流程,先查询再更新)

当然,也有一种特殊情况,如果添加的药品信息格式与文件格式不符,也会导致文件内容变化。因此,在添加药品信息时,应该确保药品信息格式与文件格式一致,否则可能会导致文件内容变化。

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

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

  • 问题内容: 我想将文件/文件组添加到现有数据库中,但是我需要从变量获取路径,因为在此脚本完成后它将有所不同。当我在SQL Management Studio 2008 R2中检查脚本时,它在处返回错误。 如何使用该变量? 脚本将不会从命令行运行! 问题答案: 使用动态SQL:

  • 问题内容: 我使用的是Visual Studio2005。我创建一个项目,而不是Web Project,仅创建Windows应用程序。 我记得可以将Access数据库文件添加到项目中。我不需要连接到服务器,可以检索数据。而且我想对SQL数据库文件做同样的事情。 我做了以下步骤: 右键单击项目。 选择添加现有项目 浏览* .mdf文件。 出现“数据源配置向导”,并显示此消息 从数据库检索信息时发生错

  • 提前提醒一下,这个文件重要的是后缀不能错,名字写成abc.js对程序运行没影响. 点一下项目中的conf目录,然后Ctrl+N,选择General->Floder,弹出新建文件夹对话框,新建一个文件夹叫ioc 点一下项目中的conf目录,然后Ctrl+N,选择General->File,弹出新建文件对话框,在ioc目录下新建一个文件叫dao.js 将下述内容填入dao.js文件 var ioc =