首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

结构体数组和文件操作有关问题

2012-07-15 
结构体数组和文件操作问题这是在linux下GCC编的部分程序,这是部分代码,求高人指出错误。第一个函数功能还没

结构体数组和文件操作问题
这是在linux下GCC编的部分程序,这是部分代码,求高人指出错误。
第一个函数功能还没完善,第二个删除有错误。
时间第一啊。。。。。
struct   Item       /*声明Item的结构体*/
{
int   Item_Code;         /*项目代码*/
char   Item_Name[20];     /*项目名称*/
int   Targeted_sales;         /*目标销售额*/
int   Year_to_Date_Sales;         /*年初至今销售额*/
};
struct   Sales       /*声明Sales结构体*/
{
int   Item_Code;         /*项目代码*/
int   Quantity_Sold;       /*已销售的数量*/
};
struct   Item   itm,iem,ite[1000];   /*ite[1000]根据需要可以调整*/
struct   Sales   sales,sale[1000];/*sale[1000]根据需要可以调整*/
FILE   *fp,*fs;
void   Rec_Deta()/*添加详细信息*/
{
system( "clear ");
fp=fopen( "item.dat ", "rb+ ");
fseek(fp,-sizeof(struct   Item),2);/*定位至文件尾并往前移动一个数据块*/
fread(&iem,sizeof(struct   Item),1,fp);   /*从当前位置开始读取*/
int   id,num=0,i=0,j=0;
printf( "\t________________________________________________________________\n ");
printf( "\n\t\tADD   ITEM   SALE   DETAILS\n ");
printf( "Enter   Item   code:   \n ");
scanf( "%d ",&id);
if(id==0)   /*编号不能为零*/
printf( "Please   input   a   true   Item   code!\n ");
else   if(id> itm.Item_Code)   /*追加判断条件:输入的编号不能比item文件里最后一个code大*/
printf( "You   can   not   input   a   code   bigger   than   %d.\n ",itm.Item_Code);
else
{
printf( "Enter   Quantity   Sold:   \n ");
scanf( "%d ",&num);
if(num <=0)   /*设定条件,数量不能小于0*/
printf( "Please   input   a   number   more   than   zero.\n ");
else
{
if((fs=fopen( "sales.dat ", "rb "))==NULL)   /*以只读的方式打开二进制文件,若没有,则新建.有就以追加读入的方式打开二进制文件*/
fs=fopen( "sales.dat ", "wb ");
else
fs=fopen( "sales.dat ", "ab ");
sales.Item_Code=id;
sales.Quantity_Sold=num;
fwrite(&sales,sizeof(struct   Sales),1,fs);/*将内容存至sale文件*/
printf( "Record   written   to   Sales   file\n ");
while(!feof(fp))   /*更新item文件数据*/
{
fread(&iem,sizeof(struct   Item),1,fp);
if(iem.Item_Code==sales.Item_Code)
{
iem.Year_to_Date_Sales=sales.Quantity_Sold;
fseek(fp,(sales.Item_Code-1)*sizeof(struct   Item),0);
fwrite(&iem,sizeof(struct   Item),1,fp);
printf( "Record   written   to   Item   file\n ");
break;
}
}
fclose(fs);
}
}
fclose(fp);
}

void   Del_Item()/*删除*/
{
system( "clear ");
int   code,i=0,j=0,k=0,t=0;
printf( "\t________________________________________________________________\n ");
printf( "\n\t\tDELETE   ITEM   DETAILS\n ");
printf( "Enter   Item   code:   ");
scanf( "%d ",&code);
fp=fopen( "item.dat ", "rb ");
fs=fopen( "sale.dat ", "rb ");
/*结构体数组的删除操作*/
if(fp==NULL)
{
printf( "ERROR!!!Can   not   find   Item   file!!\n ");
exit(1);
}
rewind(fp);
while(!feof(fp))   /*判断item文件中是否有这个code*/
{
fread(&itm,sizeof(struct   Item),1,fp);


//printf( "%d%s%d%d ",itm.Item_Code,itm.Item_Name,itm.Targeted_sales,itm.Year_to_Date_Sales);
if(itm.Item_Code==code)   /*如果有,i=1*/
{
//printf( "here   172.\n ");
i=1;
break;
}
}
if(i==0)/*item文件中没有该code的处理办法*/
{
printf( "ERROR!!!Can   not   find   this   Code   in   Item   file.\n ");
}
else
{
rewind(fp);
while(!feof(fp))/*遍历,并取出item文件里的内容保存至ite[]*/
{
fread(&ite[j],sizeof(struct   Item),1,fp);
j++;
}
for(i=code;i <j;i++)
{
ite[i]=ite[i+1];   /*将code所在那组数据删除*/
}
fclose(fp);
fp=fopen( "item.dat ", "wb ");/*删除之前的   重新建立一个文件*/
for(k=0;k <j;k++)
{
fwrite(&ite[i],sizeof(struct   Item),1,fp);/*写入文件*/
}
if(fs!=NULL)
{
rewind(fs);
j=0;
while(!feof(fs))   /*读取直至文件结尾,将sales.dat的所有信息保存到sale[]里面*/
{
fread(&sale[j],sizeof(struct   Sales),1,fs);
j++;
}
i=0;
k=0;
while(!feof(fs))   /*取出文件里的数据保存到sale[]里面*/
{
fread(&sale[k],sizeof(struct   Sales),1,fs);
if(sale[k].Item_Code==code)
{
  j=k;
  t=1;
}
k++;
}
for(i=j;i <k;i++)/*删除操作,要删除的项后一个往前移,以此类推*/
{
sale[i]=sale[i+1];
}
fclose(fs);
fs=fopen( "sales.dat ", "wb ");
for(i=0;i <k;i++)   /*将删除后的数据写入文件*/
{
fwrite(&sale[i],sizeof(struct   Sales),1,fs);     /*写入sales.dat*/
}
if(t==0)
{
printf( "\tWarning!!!!   Can   not   find   Item:%d   from   Sales   file.\n ",code);
}
else
printf( "\t%drecode <s>   deleted   from   Item   file.\n ",code);
}
else
printf( "\tERROR!!!Can   not   open   Sales   file.\n ");
}
              fclose(fp);
              fclose(fs);
}

[解决办法]
单步调试下
[解决办法]
编程的关键在调试

热点排行