C语言问题:关于fwrite
在C里面使用了fwrite函数,确定都是用二进制方式打开的,不过为什么输入新的前面的还是会变成0?另外不能连续写入,否则前面那个会被覆盖,可我用的是ab的打开方式啊。
求高手帮忙啊!!!
源程序:
程序代码:
/*办公用品库管员 用于办公用品的管理,办公用品的入库应在库房账目上加入货物的入库日期,货物型号,数量,种类等, 在货物出库时应登记出库日期,数量种类等指标,手续经办人签名等。并有库房盘点功能。 基本要求: 办公用品入库登记功能 办公用品出库登记功能 盘点功能:库中实际的办公用品存量 办公用品超出存储范围,或没有办公用品的预警功能*/ #include<stdio.h> #include<string.h> #include<stdlib.h> #define MAX_size 1001//最多录入的用品数为1000,最后一个为输入的暂存区 #define ON inf[i].model,inf[i].kind,inf[i].amount,inf[i].dt.in_y,inf[i].dt.in_m,inf[i].dt.in_d,inf[i].dt.out_y,inf[i].dt.out_m,inf[i].dt.out_d,inf[i].name typedef struct {char model[20]; char kind[20]; int amount; struct {int in_y,in_m,in_d;//入库日期 int out_y,out_m,out_d;//出库日期 }dt; char name[20]; }list; list inf[MAX_size]; void menu()//菜单 {printf("\n\n\t\t**********************************"); printf("\n\t\t\t1.入库登记"); printf("\n\t\t\t2.出库登记"); printf("\n\t\t\t3.盘点"); printf("\n\t\t\t0.退出"); printf("\n\n\t\t**********************************"); } void in()//入库登记 { int i,m=0,num,flag=0; char ch[2]="Y"; FILE *fp; if((fp=fopen("TC.txt","rb"))==NULL)//查看文件是否存在 { printf("无法打开文件!"); return; } while(!feof(fp)) { if(fread(&inf[m],sizeof(list),1,fp)==1)//将数据读入内存 m++; } fclose(fp); num=m; while(strcmp(ch,"y")==0||strcmp(ch,"Y")==0) { if(num>MAX_size)//当超出范围时发出警告 { printf("超出储存范围!"); return; } printf("请输入日期:"); scanf("%4d.%2d.%2d",&inf[1000].dt.in_y,&inf[1000].dt.in_m,&inf[1000].dt.in_d); printf("请输入货物型号:");scanf("%s",inf[1000].model); printf("请输入货物种类:");scanf("%s",inf[1000].kind); printf("请输入入库货物数量:");scanf("%d",&inf[1000].amount); strcpy(inf[1000].name,"--"); inf[1000].dt.out_y=inf[1000].dt.out_m=inf[1000].dt.out_d=0; for(i=0;i<num;i++)//判断是否为原有的物品 if(strcmp(inf[1000].model,inf[i].model)==0) { flag=1; break; } if(flag=1)//原有物品则只加数量 { fp=fopen("TC.txt","wb"); fseek(fp,sizeof(list)*i,0); inf[i].amount+=inf[1000].amount; inf[1000].amount=inf[i].amount; inf[1000].dt.out_y=inf[i].dt.out_y; inf[1000].dt.out_m=inf[i].dt.out_m; inf[1000].dt.out_d=inf[i].dt.out_d; inf[i]=inf[1000]; if(fwrite(&inf[i],sizeof(list),1,fp)!=1) printf("数据写入错误!"); fclose(fp); } else//非原有物品录入全部新信息 { fp=fopen("TC.txt","ab"); num++; if(fwrite(&inf[1000],sizeof(list),1,fp)!=1) printf("数据写入错误!"); fclose(fp); } printf("是否继续存入货物?(y/n)"); scanf("%s",ch); getchar();system("cls"); } } void out() { int i,m=0,num,flag=0; char ch[2]="Y"; FILE *fp; if((fp=fopen("TC.txt","rb"))==NULL) { printf("无法打开文件!"); return; } while(!feof(fp)) { if(fread(&inf[m],sizeof(list),1,fp)==1)//将数据读入内存 m++; } printf("当前仓库中共有%d种货物。",m); fclose(fp); num=m; while(strcmp(ch,"y")==0||strcmp(ch,"Y")==0) { printf("请输入货物型号:");scanf("%s",inf[1000].model); for(i=0;i<m;i++) { if(strcmp(inf[1000].model,inf[i].model)==0) break; else { printf("无此货物!\n");return; } } strcmp(inf[i].model,inf[1000].model); printf("请输入日期:"); scanf("%4d.%2d.%2d",&inf[i].dt.out_y,&inf[i].dt.out_m,&inf[i].dt.out_d); printf("请输入取出的货物数量:");scanf("%d",&inf[1000].amount); if(inf[1000].amount>inf[i].amount) { printf("库存不足!"); return; } inf[i].amount=inf[i].amount-inf[1000].amount; printf("请输入经办人姓名:");scanf("%s",inf[i].name); fp=fopen("TC.txt","wb"); fseek(fp,sizeof(list)*i,0); if(fwrite(&inf[i],sizeof(list),1,fp)!=1) printf("数据写入错误!"); fclose(fp); printf("是否继续存入货物?(y/n)"); scanf("%s",ch); getchar();system("cls"); } } void check() { int i,m=0; FILE *fp; if((fp=fopen("TC.txt","rb"))==NULL) { printf("无法打开文件!"); return; } while(!feof(fp)) { if(fread(&inf[m],sizeof(list),1,fp)==1)//将数据读入内存 m++; } printf("当前仓库中共有%d种货物。",m); fclose(fp); printf("\n\n货物型号 货物种类 库存量 进货时间 出货时间 经办人\n"); for(i=0;i<m;i++) printf("%-10s%-10s%-8d %d.%d.%d %d.%d.%d%10s\n",ON); getchar();system("cls"); return; } void main() {int n; menu(); scanf("%d",&n); getchar();system("cls"); while(n) { switch(n) {case 1:in();break; case 2:out();break; case 3:check();break; case 0:printf("谢谢使用!\n");return; default:printf("操作错误!\n"); } menu(); scanf("%d",&n); getchar();system("cls"); } }