#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
因为你添加药品信息模块后,再次打开文件会改变文件内容。这是因为在添加药品信息时,可能修改了文件中已有的数据。例如,如果药品编号为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 =