C语言文件输出后多出好多0?

头像
YOLO
    713
    内蒙古呼和浩特市

    include <stdio.h>

    include <stdlib.h>

    include <stdbool.h>

    include <string.h>

    define MEDICINE_FILE "medicine.txt" //药品文件名

    typedef struct medicine
    {

    char drug_name[100]; //药品名
    int drug_number;     //药品编号
    int 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 %d %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("%d", &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%d\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%d\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%d\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("%d", &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%d\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%d\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 %d %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

    不知道为什么输出总是有问题,文件里的内容输出了,但是多出好多0,格式也有问题,希望各位大佬帮帮忙

    阅读 2.7k
    1 个回答

    问题描述给的很详细,很棒!我把你的代码全部复制下来放到vs里跑了一遍,看到你在读取和保存药品信息时出现了问题。读取文件时,您使用了fscanf函数来解析每一行的数据并存储到你定义的med.medicine_array数组中,但是你并没有正确处理字符串结尾的空字符'\0',导致后续输出可能会出现意外的结果。(这是第一个bug)
    然后,在保存药品信息到文件时,您使用了fprintf函数将药品信息写入文件,但是在格式化字符串中没有指定浮点数的精度,这可能导致输出的价格有多余的零。(这是第二个bug),好了,夜已深,授之以渔,也授之以鱼,我把代码给你按照我描述的修改了一下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAX_SIZE 100
    
    // 定义药品结构体
    typedef struct {
        char drug_name[100];
        int drug_code;
        float drug_price;
        int stock;
    } Medicine;
    
    // 定义药品库存结构体
    typedef struct {
        int size;
        Medicine medicine_array[MAX_SIZE];
    } MedicineInventory;
    
    // 从文件中读取药品信息
    void read_medicine_file(MedicineInventory *med) {
        FILE *fp;
        char filename[] = "medicine.txt";
        char line[200];
    
        fp = fopen(filename, "r");
    
        if (fp == NULL) {
            printf("无法打开文件:%s\n", filename);
            exit(1);
        }
    
        // 初始化药品库存大小为0
        med->size = 0;
    
        // 使用一个临时变量来存储解析后的数据
        Medicine temp_med;
    
        while (fgets(line, sizeof(line), fp)) {
            // 使用sscanf解析每一行的数据并存储到临时药品结构体中
    
            sscanf(line, "%[^,],%d,%f,%d",
                   temp_med.drug_name,
                   &temp_med.drug_code,
                   &temp_med.drug_price,
                   &temp_med.stock);
    
            // 给药品名称字符串末尾添加空字符'\0',以确保它是一个有效的C字符串
            temp_med.drug_name[strlen(temp_med.drug_name)] = '\0';
    
            // 将临时药品结构体的数据复制到药品库存结构体数组中
            med->medicine_array[med->size] = temp_med;
    
            // 更新药品库存大小
            med->size++;
        }
    
        fclose(fp);
    }
    
    // 显示药品信息
    void show_medicine(MedicineInventory med) {
        int i;
    
        printf("药品名称\t\t\t药品编码\t\t药品价格\t\t库存\n");
        printf("----------------------------------------------------------\n");
    
        for (i = 0; i < med.size; i++) {
            // 使用%.2f作为格式字符串来打印价格,限制小数位数为两位
            printf("%s\t\t\t%d\t\t\t%.2f\t\t\t%d\n",
                   med.medicine_array[i].drug_name,
                   med.medicine_array[i].drug_code,
                   med.medicine_array[i].drug_price,
                   med.medicine_array[i].stock);
        }
    }
    
    int main() {
        MedicineInventory med;
    
        read_medicine_file(&med);
    
        show_medicine(med);
    
        return 0;
    }
    

    希望可以帮到你

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