这段函数是用来计算总费用的,通过入院登记文件中的住院号匹配费用表中相同的住院号,然后读取记录,将同一住院号的不同缴费金额相加,得到的结果再写入入院登记表中相应的位置。但实际操作时,好像是循环控制出现了问题,是不是代码有问题?
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
void AutoComp(void) { // 自动计算每一个病人住一次院所缴费用
long pos; float totalcost;
FILE *fp1, *fp2;
InTab it; // 定义住院登记表的结构体变量it
BillTab bt; // 定义费用表的结构体变量bt
if ((fp1=fopen(".\\4810IN.dat", "r+b"))==0) {
printf("\n\n无法打开住院登记信息文件!\n");
return;
}
if ((fp2=fopen(".\\4810BILL.dat", "rb"))==0) {
printf("\n\n无法打开费用信息文件!\n");
fclose(fp1); return;
}
system("cls");
printf("\n\n\t\tAuto computing, Please waiting......");
pos=ftell(fp1); // 保留要读取的住院记录在住院登记文件中的位移量,以便重新定位该记录进行更新
fread(&it, sizeof(InTab), 1, fp1); // 从住院登记文件中读取一个住院记录
while (!feof(fp1)) { // 计算每一个住院记录对应的费用总额
totalcost=0;
rewind(fp2); // 复位到费用文件头
fread(&bt, sizeof(BillTab), 1, fp2); // 从费用文件中读取一个费用记录
while (!feof(fp2)) { // 在费用文件中查找住院号微it.num病人的所有缴费记录
if (strcmp(bt.num, it.num)==0) {
// 如果在费用文件中找到了住院号为it.num病人的缴费记录,则进行汇总计算
totalcost+=bt.amount; // 缴费记录相加求和
break; //结束在费用文件中的查找
}
fread(&bt, sizeof(BillTab), 1, fp2); // 从费用文件中读取一个费用记录
}
it.cost=totalcost; // 用计算得到的汇总值更新住院登记结构体变量it的对应成员值
fseek(fp1, pos, SEEK_SET); // 在住院登记文件中定位正在进行汇总计算的住院记录
fwrite(&it, sizeof(InTab), 1, fp1); // 用住院登记结构体变量it更新住院登记文件中已定位的住院记录内容
pos=pos+sizeof(InTab); // 计算下一个待处理住院记录的位移量(即当前记录的下一个记录的位移量)
fseek(fp1, pos, SEEK_SET); // 在住院登记文件中定位下一个待处理的住院记录
fread(&bt, sizeof(InTab), 1, fp1); // 从住院登记文件中读取一个住院记录
}
fclose(fp1); fclose(fp2);
system("cls");
printf("\n\n\t\t完成自动计算. ");
system("pause");
}
惊回头
相关分类