读书人

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

发布时间: 2012-07-15 20:11:29 作者: rapoo

结构体数组和文件操作问题
这是在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);
}

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

读书人网 >C语言

热点推荐