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");
}
}










真的是蛋都碎掉了。。。问题就在这!!!谢了