C语言添加药品信息模块添加进去和文件格式不符并且再次打开文件会改变文件内容?

#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
阅读 2.2k
1 个回答

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进