C语言文件输出后多出好多0?-灵析社区

萌蒙萌

## include ## include ## include ## include ## 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 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,格式也有问题,希望各位大佬帮帮忙

阅读量:390

点赞量:13

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