当前位置: 代码迷 >> C语言 >> [求助]关于使用结构体数组的几个问题
  详细解决方案

[求助]关于使用结构体数组的几个问题

热度:230   发布时间:2006-02-13 18:06:00.0
[求助]关于使用结构体数组的几个问题

大家好,因为本人刚学完部分C语言,老师布置一道大作业题,编写一个简易的电话号码存储系统。我在做修改客户信息时编了如下代码:
我的思路时,找到要修改的客户信息时,然后用循环语句把后面的客户信息往前推,即后面覆盖前面的。

执行时问题:找到要修改的信息,可以结果不是后面的客户信息把要删的客户信息覆盖掉,显示几行“烫”字,后面的信息依然未变,我看了STRCPY()函数,没看出什么地方错误!!!不知哪位高手能否帮我解答,或者跟我学习进度一样的朋友一起切磋切磋。

代码:
void delcust()
{
FILE *fp;
struct cust_st customer[100];//结构体已在前面声明了//
int size=sizeof(struct cust_st);
int i,j, count=0;
char temp[31],flag='y', found='n';

while((fp=fopen("telephone.dat","r+b"))==NULL)
{
printf("\nERROR opening this file!!!");
getchar();
exit(1);
}
while(!feof(fp))//计数在文件中有几个结构体信息,为下面的循环语句用//
{
if((fread(customer,size,1,fp))==1)
(count++);
}


while(flag=='y')
{

system("cls");
printf("\n---------------------------------------------------------------");
printf("\n* 删除客户信息 *");
printf("\n---------------------------------------------------------------");
printf("\n\n请输入要删除客户的名称:");
scanf("%s",temp);
rewind(fp);
for(i=0;i<count;i++)
{
fread(&customer[i],size,1,fp);//把文件读到内存中//
if((strcmp(customer[i].name,temp))==0)
{
found='y';
break;
}
else
{
printf("\n\n您输入的客户不存在!!!");
break;
}

}

if(found=='y')
{
printf("\n\n\t客户名称 = %s",customer[i].name);
printf("\n\t客户地址 = %s",customer[i].address);
printf("\n\t电话号码 = %s",customer[i].telnumber);
for(j=i+1,i=0;j<count;j++)
{
strcpy(customer[j-1].name,customer[j].name);
strcpy(customer[j-1].address,customer[j].address);
strcpy(customer[j-1].telnumber,customer[j].telnumber);
}
printf("\n\n 该客户已被删除...");

}


rewind(fp);
for(i=0;i<(count-1);i++)
fwrite(&customer[i],size,1,fp);
printf("\n\n是否继续删除客户信息:(y/n)");
scanf(" %c",&flag);

}

fclose(fp);
}

搜索更多相关的解决方案: 结构体  

----------------解决方案--------------------------------------------------------
while(!feof(fp))//计数在文件中有几个结构体信息,为下面的循环语句用//
{
if((fread(customer,size,1,fp))==1)
(count++);
}

这个不对吧 customer 一直都没变啊 怎么读到结构体数组里??
----------------解决方案--------------------------------------------------------
改成这样看看
while(!feof(fp))//计数在文件中有几个结构体信息,为下面的循环语句用//
{
if((fread(customer++,size,1,fp))==1)
(count++);
}
----------------解决方案--------------------------------------------------------
这种题用动态链表做比较好吧 删除容易得很 改几下指针就完事
----------------解决方案--------------------------------------------------------
以下是引用stdio在2006-2-13 22:08:00的发言:
while(!feof(fp))//计数在文件中有几个结构体信息,为下面的循环语句用//
{
if((fread(customer,size,1,fp))==1)
(count++);
}

这个不对吧 customer 一直都没变啊 怎么读到结构体数组里??

不过我在这里目的倒不是读到结构体数组,而是计算在文件在有几个结构体信息,为下面的循环语句做准备。不过话说回来,你说得没错啊,customer当然没变,不过读文件一个信息成功时,文件指针会自动指向下一个信息,靠feof(fp)函数应当能读完文件的,不过打印结构体数组customer时,只能打印出第一个信息。而变量count打印时是显示实际的文件内的几个信息的。郁闷!!!


----------------解决方案--------------------------------------------------------
以下是引用stdio在2006-2-13 22:11:00的发言:
这种题用动态链表做比较好吧 删除容易得很 改几下指针就完事

动态我们这个教程没提到,所以目前还不会做!!!


----------------解决方案--------------------------------------------------------
链表本身不是动态的吗?
----------------解决方案--------------------------------------------------------