user-0 提问: [求助]我修改链表内某一成员后显示设备信息报错了 应该怎么改

回复:
user: user-0
content: 引用 2 楼 qq423399099 的回复:稍微发现了几个问题 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相同的名字，仅此而已。 不要意思我又有问题了 大概这应该是最后一个了 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 input(); int displayEquips(); //int total(); int main()        /*添加模块*/ {  int n,w,t;   	for(t=0;t<1;t++) 	{  	do  	{ 		system("cls");   		puts("\t\t**************************MENU***************************\n");  		puts("\t\t    **           0.     添加设备信息           **\n");  		puts("\t\t    **           1.     追加设备信息           **\n");  		puts("\t\t    **           2.     修改设备信息           **\n"); 	 	puts("\t\t    **           3.     分类统计信息           **\n"); 	 	puts("\t\t    **           4.     搜索设备信息           **\n");  		puts("\t\t    **           5.     退出管理系统           **\n");  		puts("\t\t    **           6.     显示设备信息           **\n");  		puts("\t\t**********************************************************\n"); 	 	printf("你想做什么？(0-6):");  		scanf("%d",&n);   		if(n<0||n>6)           /*对选择的数字作出判断*/ 	 	{  		w=1;   	  	getchar();  		}   		else  		w=0;	 	}   	while(w==1);    	switch(n)    	{         	case 0:t=addition(); break;    /*输入模块*/   	case 1:t=input();break; //追加模块      	case 2:t=modifty();break;  /*修改模块*/     	//case 3:t=total();break;     /*统计模块*/     //	case 4:t=search();break;   /*搜索模块*/     	case 5:exit(0);           /*退出*/ 	case 6:t=displayEquips();break;  	}		  	} }   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;	 		} 	}	 	 		//p=Head->next; 		fseek(fp,0,0); 		fread(p,sizeof(Equip),1,fp); 		printf("编号\t种类\t名称\t价格\t\t购买日期\t是否报废\t报废日期\n"); 	//while(p!=NULL) 	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); 	//	p=p->next; }	 	printf("\n-----------------------\n");    	printf("返回菜单？   \n");                                                                                                                          	printf("1.是\n");   	printf("2.不，退出\n");  	scanf("%d",&c);  	if(c==1)return(-1);   	if(c==2)return(0);     } int input() { 		int c; 	FILE *fp;  	Equip *Head,*p;  	char st[]="No"; 	system("cls");	 	printf("**********************************************************\n");    	printf("添加设备：\n");      	printf("**********************************************************\n");   	fp=fopen("Equip.txt","ab+");	 	Head=(struct Equip*)malloc(sizeof(struct Equip));  	//p=(struct Equip*)malloc(sizeof(struct Equip));  	if(fp==NULL) 	{ 		printf("不能打开Equip.txt文件，自动执行系统初始化功能!\n"); 	}		 	fseek(fp,0,2); 	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=p; 		printf("还想继续输入吗？\n"); 		printf("1.是\n"); 		printf("2.不是\n");  		scanf("%d",&c); 		if(c==2) 		{ 		break;	 		} 		printf("\n------------------------------------\n");  		printf("返回菜单？   \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];  	int i=0,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"); 	}   	p=(struct Equip*)malloc(sizeof(struct Equip)); 	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); 			fseek(fp,sizeof(Equip)*(-1),1); 			fwrite(p,sizeof(Equip),1,fp);      		break; 		} 		fread(p,sizeof(Equip),1,fp); 		p=p->next; 		i++; 	} 		printf("修改后的设备信息:\n"); 		fseek(fp,sizeof(Equip)*(i),0); 		fread(p,sizeof(Equip),1,fp); 		printf("编号\t种类\t名称\t价格\t\t购买日期\t是否报废\t报废日期\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);  }  int displayEquips() { 	int c; 	FILE *fp; 	system("cls"); 	fp=fopen("Equip.txt","rb");	 	if(fp==NULL) 	{ 		printf("不能打开Equip.txt文件\n"); 	}		 	Equip *p; 	p=(struct Equip*)malloc(sizeof(struct Equip)); 	fseek(fp,0,0); 	printf("编号\t种类\t名称\t价格\t\t购买日期\t是否报废\t报废日期\n"); 	fread(p,sizeof(Equip),1,fp); 	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("返回菜单？   \n"); 	printf("1.是 \n"); 	printf("2.不，退出\n");  	scanf("%d",&c);  	if(c==1)return(-1); 	if(c==2)return(0);  } }我想用input函数追加信息    把追加信息接到用p->next=p的接到p链表上   用displayEquips可以显示 但是用修改信息的函数我追加的信息就不能修改  但是我最开始用additon函数输入的信息就能修改  请给点看法和意见吧

user: user-0
content: 引用 7 楼 qq423399099 的回复:[quote=引用 6 楼 zywd4200 的回复:] [quote=引用 2 楼 qq423399099 的回复:] 稍微发现了几个问题 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相同的名字，仅此而已。 不要意思我又有问题了 大概这应该是最后一个了 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 input(); int displayEquips(); //int total(); int main()        /*添加模块*/ {  int n,w,t;   	for(t=0;t<1;t++) 	{  	do  	{ 		system("cls");   		puts("\t\t**************************MENU***************************\n");  		puts("\t\t    **           0.     添加设备信息           **\n");  		puts("\t\t    **           1.     追加设备信息           **\n");  		puts("\t\t    **           2.     修改设备信息           **\n"); 	 	puts("\t\t    **           3.     分类统计信息           **\n"); 	 	puts("\t\t    **           4.     搜索设备信息           **\n");  		puts("\t\t    **           5.     退出管理系统           **\n");  		puts("\t\t    **           6.     显示设备信息           **\n");  		puts("\t\t**********************************************************\n"); 	 	printf("你想做什么？(0-6):");  		scanf("%d",&n);   		if(n<0||n>6)           /*对选择的数字作出判断*/ 	 	{  		w=1;   	  	getchar();  		}   		else  		w=0;	 	}   	while(w==1);    	switch(n)    	{         	case 0:t=addition(); break;    /*输入模块*/   	case 1:t=input();break; //追加模块      	case 2:t=modifty();break;  /*修改模块*/     	//case 3:t=total();break;     /*统计模块*/     //	case 4:t=search();break;   /*搜索模块*/     	case 5:exit(0);           /*退出*/ 	case 6:t=displayEquips();break;  	}		  	} }   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;	 		} 	}	 	 		//p=Head->next; 		fseek(fp,0,0); 		fread(p,sizeof(Equip),1,fp); 		printf("编号\t种类\t名称\t价格\t\t购买日期\t是否报废\t报废日期\n"); 	//while(p!=NULL) 	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); 	//	p=p->next; }	 	printf("\n-----------------------\n");    	printf("返回菜单？   \n");                                                                                                                          	printf("1.是\n");   	printf("2.不，退出\n");  	scanf("%d",&c);  	if(c==1)return(-1);   	if(c==2)return(0);     } int input() { 		int c; 	FILE *fp;  	Equip *Head,*p;  	char st[]="No"; 	system("cls");	 	printf("**********************************************************\n");    	printf("添加设备：\n");      	printf("**********************************************************\n");   	fp=fopen("Equip.txt","ab+");	 	Head=(struct Equip*)malloc(sizeof(struct Equip));  	//p=(struct Equip*)malloc(sizeof(struct Equip));  	if(fp==NULL) 	{ 		printf("不能打开Equip.txt文件，自动执行系统初始化功能!\n"); 	}		 	fseek(fp,0,2); 	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=p; 		printf("还想继续输入吗？\n"); 		printf("1.是\n"); 		printf("2.不是\n");  		scanf("%d",&c); 		if(c==2) 		{ 		break;	 		} 		printf("\n------------------------------------\n");  		printf("返回菜单？   \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];  	int i=0,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"); 	}   	p=(struct Equip*)malloc(sizeof(struct Equip)); 	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); 			fseek(fp,sizeof(Equip)*(-1),1); 			fwrite(p,sizeof(Equip),1,fp);      		break; 		} 		fread(p,sizeof(Equip),1,fp); 		p=p->next; 		i++; 	} 		printf("修改后的设备信息:\n"); 		fseek(fp,sizeof(Equip)*(i),0); 		fread(p,sizeof(Equip),1,fp); 		printf("编号\t种类\t名称\t价格\t\t购买日期\t是否报废\t报废日期\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);  }  int displayEquips() { 	int c; 	FILE *fp; 	system("cls"); 	fp=fopen("Equip.txt","rb");	 	if(fp==NULL) 	{ 		printf("不能打开Equip.txt文件\n"); 	}		 	Equip *p; 	p=(struct Equip*)malloc(sizeof(struct Equip)); 	fseek(fp,0,0); 	printf("编号\t种类\t名称\t价格\t\t购买日期\t是否报废\t报废日期\n"); 	fread(p,sizeof(Equip),1,fp); 	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("返回菜单？   \n"); 	printf("1.是 \n"); 	printf("2.不，退出\n");  	scanf("%d",&c);  	if(c==1)return(-1); 	if(c==2)return(0);  } }我想用input函数追加信息    把追加信息接到用p->next=p的接到p链表上   用displayEquips可以显示 但是用修改信息的函数我追加的信息就不能修改  但是我最开始用additon函数输入的信息就能修改  请给点看法和意见吧[/quote] 还不如重新存一个新文件，然后删了旧文件[/quote]每次追加都重新存一个然后删掉旧的吗  0 0

user: user-1
content: 引用 6 楼 zywd4200 的回复:[quote=引用 2 楼 qq423399099 的回复:] 稍微发现了几个问题 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相同的名字，仅此而已。 不要意思我又有问题了 大概这应该是最后一个了 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 input(); int displayEquips(); //int total(); int main()        /*添加模块*/ {  int n,w,t;   	for(t=0;t<1;t++) 	{  	do  	{ 		system("cls");   		puts("\t\t**************************MENU***************************\n");  		puts("\t\t    **           0.     添加设备信息           **\n");  		puts("\t\t    **           1.     追加设备信息           **\n");  		puts("\t\t    **           2.     修改设备信息           **\n"); 	 	puts("\t\t    **           3.     分类统计信息           **\n"); 	 	puts("\t\t    **           4.     搜索设备信息           **\n");  		puts("\t\t    **           5.     退出管理系统           **\n");  		puts("\t\t    **           6.     显示设备信息           **\n");  		puts("\t\t**********************************************************\n"); 	 	printf("你想做什么？(0-6):");  		scanf("%d",&n);   		if(n<0||n>6)           /*对选择的数字作出判断*/ 	 	{  		w=1;   	  	getchar();  		}   		else  		w=0;	 	}   	while(w==1);    	switch(n)    	{         	case 0:t=addition(); break;    /*输入模块*/   	case 1:t=input();break; //追加模块      	case 2:t=modifty();break;  /*修改模块*/     	//case 3:t=total();break;     /*统计模块*/     //	case 4:t=search();break;   /*搜索模块*/     	case 5:exit(0);           /*退出*/ 	case 6:t=displayEquips();break;  	}		  	} }   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;	 		} 	}	 	 		//p=Head->next; 		fseek(fp,0,0); 		fread(p,sizeof(Equip),1,fp); 		printf("编号\t种类\t名称\t价格\t\t购买日期\t是否报废\t报废日期\n"); 	//while(p!=NULL) 	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); 	//	p=p->next; }	 	printf("\n-----------------------\n");    	printf("返回菜单？   \n");                                                                                                                          	printf("1.是\n");   	printf("2.不，退出\n");  	scanf("%d",&c);  	if(c==1)return(-1);   	if(c==2)return(0);     } int input() { 		int c; 	FILE *fp;  	Equip *Head,*p;  	char st[]="No"; 	system("cls");	 	printf("**********************************************************\n");    	printf("添加设备：\n");      	printf("**********************************************************\n");   	fp=fopen("Equip.txt","ab+");	 	Head=(struct Equip*)malloc(sizeof(struct Equip));  	//p=(struct Equip*)malloc(sizeof(struct Equip));  	if(fp==NULL) 	{ 		printf("不能打开Equip.txt文件，自动执行系统初始化功能!\n"); 	}		 	fseek(fp,0,2); 	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=p; 		printf("还想继续输入吗？\n"); 		printf("1.是\n"); 		printf("2.不是\n");  		scanf("%d",&c); 		if(c==2) 		{ 		break;	 		} 		printf("\n------------------------------------\n");  		printf("返回菜单？   \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];  	int i=0,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"); 	}   	p=(struct Equip*)malloc(sizeof(struct Equip)); 	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); 			fseek(fp,sizeof(Equip)*(-1),1); 			fwrite(p,sizeof(Equip),1,fp);      		break; 		} 		fread(p,sizeof(Equip),1,fp); 		p=p->next; 		i++; 	} 		printf("修改后的设备信息:\n"); 		fseek(fp,sizeof(Equip)*(i),0); 		fread(p,sizeof(Equip),1,fp); 		printf("编号\t种类\t名称\t价格\t\t购买日期\t是否报废\t报废日期\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);  }  int displayEquips() { 	int c; 	FILE *fp; 	system("cls"); 	fp=fopen("Equip.txt","rb");	 	if(fp==NULL) 	{ 		printf("不能打开Equip.txt文件\n"); 	}		 	Equip *p; 	p=(struct Equip*)malloc(sizeof(struct Equip)); 	fseek(fp,0,0); 	printf("编号\t种类\t名称\t价格\t\t购买日期\t是否报废\t报废日期\n"); 	fread(p,sizeof(Equip),1,fp); 	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("返回菜单？   \n"); 	printf("1.是 \n"); 	printf("2.不，退出\n");  	scanf("%d",&c);  	if(c==1)return(-1); 	if(c==2)return(0);  } }我想用input函数追加信息    把追加信息接到用p->next=p的接到p链表上   用displayEquips可以显示 但是用修改信息的函数我追加的信息就不能修改  但是我最开始用additon函数输入的信息就能修改  请给点看法和意见吧[/quote] 还不如重新存一个新文件，然后删了旧文件

user: user-2
content: 引用 2 楼 qq423399099 的回复:稍微发现了几个问题 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相同的名字，仅此而已。 后面这段不是赵老师的名句么。。。

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

user: user-0
content: 引用 2 楼 qq423399099 的回复:稍微发现了几个问题 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相同的名字，仅此而已。好的 我试试 谢谢！

user: user-1
content: 稍微发现了几个问题 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相同的名字，仅此而已。

user: user-0
content: 添加设备信息的函数可以正常使用  主要是修改设备信息的那个函数出了问题   请各位帮我看看怎么改谢谢了