user-0 提问: 对于c语言用文本txt文件存储数据  我百度了很多书也翻了很多  究竟我哪里错了...

回复:
user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  请检查fscanf的返回值。

user: user-2
content: 问题出在这里： fscanf(rs,"%s%d%.2f%d%d",g1->gname,&g1->allweight,&g1->money,&g1->Unit_price,&g1->Unit_sell);  原因是  scanf家族(scanf,fscanf,sscanf等), 在提取浮点数据的时候，不能指定数据精度.  这一点与printf家族有所不同  你把%.2f改成%f就可以了

user: user-0
content: 引用 1 楼 user-3 的回复:读的时候不要用模式at+打开，这个是按文本增加方式打开， 打开的时候读写指针在末尾，所以你读不到数据，还是可以写的方式，这样也不太好 应该用 rt 模式打开就可以了 然后我刚刚试了一下打开之后用rewind()函数用在第86行将指针移到了文件的开头也还是不行...

user: user-0
content: 第一个创建信息那个Cre_Goods函数没有问题 可以成功创建也可以往文件中输入信息 但是第二个函数Run_Purchase这个函数还是有问题   我按楼上的各位大神的方法修改了一下子还是不可以...void Run_Purchase(struct Purchase *head1,struct Goods *head2) {     char x;     struct Goods *g1,*g2;     struct Purchase *p1;     FILE *rs;     if((rs=fopen("货物信息.txt","at+"))==NULL)   //此处用at+是为了匹配到后将进货的重量输入到货物信息中      {      	printf("打开失败!按任意键返回主菜单。\n");       	scanf("%s",x);         menu();     } 	g1=(struct Goods *)malloc(sizeof(struct Goods)); 	g2=(struct Goods *)malloc(sizeof(struct Goods)); 	rewind(rs);     //将文件中的指针移到文件开头  	g2=head2; 	fscanf(rs,"%s %d%d%f%d%d",g1->gname,&g1->allweight,&g1->sellweight,&g1->money,&g1->Unit_price,&g1->Unit_sell); 	while(feof(rs)==0) 	{ 		g2->next=g1; 		g2=g1; 		g1=(struct Goods *)malloc(sizeof(struct Goods)); 		fscanf(rs,"%s %d%d%f%d%d",g1->gname,&g1->allweight,&g1->sellweight,&g1->money,&g1->Unit_price,&g1->Unit_sell); 	} 	g2->next=0; 	p1=(struct Purchase *)malloc(sizeof(struct Purchase)); 	if(p1==0) 	{ 		printf("添加失败！返回主菜单\n"); 		menu(); 	} 	printf("输入进货的货物的名字："); 	scanf("%s",p1->gname); 	printf("输入该货物的此次进货重量："); 	scanf("%d",&p1->weight); 	printf("输入此次购买该货物所花费的总金额："); 	scanf("%f",&p1->money); 	FILE *rw; 	if((rw=fopen("进货信息.txt","a"))==NULL) 	{ 		printf("信息存储失败!按任意键返回主菜单。\n"); 		scanf("%s",x); 		menu(); 	} 	fprintf(rw,"%s%d%f",p1->gname,&p1->weight,&p1->money);   //此处往新文件中输入信息不成功，文件中没信息  	while(head2->next) 	{ 		if(head2->next->gname==p1->gname) 		{ 			head2->next->allweight+=p1->weight; 			fprintf(rs,"%s%d%d%f%d%d",head2->next->gname,&head2->next->allweight,&head2->next->sellweight,&head2->next->money,&head2->next->Unit_price,&head2->next->Unit_sell); 			break; 		} 		else 			head2->next=head2->next->next; 	} 	if(head2->next==0) 	{ 		printf("请先添加该货物的信息！\n"); 		printf("添加请按1\n返回主菜单请按0\n"); 		scanf("%d",&x); 		if(x==1) 		Cre_Goods(g1); 		else 			menu();  	} 	else 	{ 	printf("继续添加请按1\n"); 		printf("返回主菜单请按0\n"); 	if(x==1) 			Run_Purchase(p1,g1); 	else 		menu(); 	} 	fclose(rw); 	fclose(rs); }  然后现在发现一个问题就是程序运行要先用Cre_Goods输入货物信息才能用Run_Purchase函数，否则就会程序停止运行，即便之前输入过数据也不行 拜托各位大神再仔细看看

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  请检查fscanf的返回值。想问一下是不是读取货物名字的字符串的问题  就是那个%s的问题，但是不用%s  不知道用什么来读取货物的名字

user: user-0
content: 引用 3 楼 whut_lcy 的回复:问题出在这里： fscanf(rs,"%s%d%.2f%d%d",g1->gname,&g1->allweight,&g1->money,&g1->Unit_price,&g1->Unit_sell);  原因是  scanf家族(scanf,fscanf,sscanf等), 在提取浮点数据的时候，不能指定数据精度.  这一点与printf家族有所不同  你把%.2f改成%f就可以了 更改了还是不行....

user: user-3
content: 读的时候不要用模式at+打开，这个是按文本增加方式打开， 打开的时候读写指针在末尾，所以你读不到数据，还是可以写的方式，这样也不太好 应该用 rt 模式打开就可以了