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