[求帮助]本人修改链表内某一成员后显示设备信息报错了 应该怎么改

C语言 码拜 9年前 (2016-04-13) 944次浏览
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Equip   //定义结构体
{
char equipCode[10];    //编号
char equipType[20];    //种类
char equipName[20];    //名称
float  equipPrice;     //价格
char buyDate[20];      //购买日期
int   scrap;           //能否报废
char  scrapDate[20];  //报废日期
struct Equip *next;
}
Equip;
int addition();
int modifty();
int main()        /*添加模块*/
{
int n,w,t;
for(t=0;t<1;t++)
{
do
{
system(“cls”);
puts(“\t\t**************************MENU***************************\n”);
puts(“\t\t    **           1.     添加设备信息           **\n”);
puts(“\t\t    **           2.     修改设备信息           **\n”);
puts(“\t\t**********************************************************\n”);
printf(“你想做什么?(0-5):”);
scanf(“%d”,&n);
if(n<0||n>5)           /*对选择的数字作出判断*/
{
w=1;
getchar();
}
else
w=0;
}
while(w==1);
switch(n)
{
case 1:t=addition(); break;    /*输入模块*/
case 2:t=modifty();break;  /*修改模块*/
case 5:exit(0);           /*退出*/   }
}
}
int addition()
{
int c;
FILE *fp;
Equip *Head,*p;
char st[]=”No”;
system(“cls”);
Head=(struct Equip*)malloc(sizeof(struct Equip));
Head->next=NULL;
printf(“**********************************************************\n”);
printf(“添加设备:\n”);
printf(“**********************************************************\n”);
fp=fopen(“Equip.txt”,”wb+”);
if(fp==NULL)
{
printf(“不能打开Equip.txt文件,自动执行系统初始化功能!\n”);
}
fseek(fp,0,0);
while(1)
{
p=(struct Equip*)malloc(sizeof(struct Equip));
printf(“请输入设备编号\n”);
scanf(“%s”,&(p->equipCode));
printf(“请输入设备种类\n”);
scanf(“%s”,&(p->equipType));
printf(“请输入设备名称\n”);
scanf(“%s”,&(p->equipName));
printf(“请输入设备价格\n”);
scanf(“%f”,&(p->equipPrice));
printf(“输入购买日期\n”);
scanf(“%s”,&(p->buyDate));
printf(“能否报废?0/1\n”);
scanf(“%d”,&(p->scrap));
if(p->scrap==1)
{
printf(“请输入报废日期\n”);
scanf(“%s”,&(p->scrapDate));
}
else
strcpy(p->scrapDate,st);
fwrite(p,sizeof(Equip),1,fp);
p->next=Head->next;
Head->next=p;
printf(“还想继续输入吗?\n”);
printf(“1.是\n”);
printf(“2.不是\n”);
scanf(“%d”,&c);
if(c==2)
{
break;
}
}
fseek(fp,0,0);
fread(p,sizeof(Equip),1,fp);
printf(“编号\t种类\t名称\t价格\t\t购买日期\t能否报废\t报废日期\n”);
while(!feof(fp))
{
printf(“%s\t%s\t%s\t%f\t%s\t\t%d\t\t%s\n”,p->equipCode,p->equipType,p->equipName,p->equipPrice,p->buyDate,p->scrap,p->scrapDate);
fread(p,sizeof(Equip),1,fp);
}
printf(“\n–\n”);
printf(“1.是\n”);
printf(“2.不,退出\n”);
scanf(“%d”,&c);
if(c==1)return(-1);
if(c==2)return(0);
}
int modifty()        /*修改模块*/
{
char st[]=”No”;
char code[10];
char equipNo[10];
int i,j,c;
Equip *Head,*p;
FILE *fp;
system(“cls”);
printf(“**********************************************************\n”);
printf(“修改设备信息:\n”);
printf(“**********************************************************\n”);
printf(“请输入要修改的设备编号:\n”);
scanf(“%s”,code);                        /*输入要修改的设备编号*/
printf(“–\n”);
if((fp=fopen(“Equip.txt”,”rt+”))==NULL)
{
printf(“\n不能打开文件!\n”);
}
fseek(fp,0,0);
fread(p,sizeof(Equip),1,fp);
while(!feof(fp))     //从文件头一个一个的读取字符,读到文件的结尾。
{
if(strcmp(p->equipCode,code)==0)//判断文件中的数据与输入数能否匹配
{
printf(“–\n”);
printf(“输入新设备编号\n”);
scanf(“%s”,&(p->equipCode));
printf(“输入新设备种类\n”);
scanf(“%s”,&(p->equipType));
printf(“输入新设备名称\n”);
scanf(“%s”,&(p->equipName));
printf(“输入新设备价格\n”);
scanf(“%f”,&(p->equipPrice));
printf(“输入新购买日期\n”);
scanf(“%s”,&(p->buyDate));                    //判断能否报废
printf(“输入新能否报废?0/1\n”);
scanf(“%d”,&(p->scrap));
if(p->scrap==1)
{
printf(“请输入新报废日期\n”);
scanf(“%s”,&(p->scrapDate));
}
else
strcpy(p->scrapDate,st);
fwrite(p,sizeof(Equip),1,fp);
}
fread(p,sizeof(Equip),1,fp);
p=p->next;
i++;
}
/*将修改后的信息写入文件中*/
printf(“修改后的设备信息:\n”);
printf(“%s\t%s\t%s\t%f\t%s\t\t%d\t\t%s\n”,p->equipCode,p->equipType,p->equipName,p->equipPrice,p->buyDate,p->scrap,p->scrapDate);
printf(“\n–\n”);
printf(“返回菜单?   \n”);
printf(“1.是 \n”);
printf(“2.不,退出\n”);
scanf(“%d”,&c);
if(c==1)return(-1);
if(c==2)return(0);
}
运行到显示修改后的设备信息以后就报错了。其实本人感觉本人修改成员信息那个循环也错了 用了fwrite后会覆盖掉那个成员吗 假如覆盖成功了怎么样显示修改后的设备成员  假如没修改成功又怎么办   请各位高手支点招
解决方案

60

稍微发现了几个问题
1.modifty函数内没有对p分配空间,直接就fread(p,sizeof(Equip),1,fp);了
2.modifty函数内i没有初始化
3.你fwrite以后应该重新fseek一下你的文件指针(你的代码里就算找到了equipCode也会循环到文件末尾)
代码功能归根结底不是别人帮本人看或讲解或注释出来的;而是被本人静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生本人领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
所谓修改删除文件a某位置的内容,其实是读打开文件a,再将‘a中修改删除位置之前的内容+修改删除的内容+a中修改删除位置之后的内容’保存到文件b,关闭文件a,删除文件a,将文件b改名为与之前文件a相同的名字,仅此而已。

10

目测你的数据结构是一个链表。
问题应该出在 函数内部变量的生命周期。
链表的头。没有。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明[求帮助]本人修改链表内某一成员后显示设备信息报错了 应该怎么改
喜欢 (0)
[1034331897@qq.com]
分享 (0)