user-0 提问: [求助]c语言fwrite保存链表时出现 屯，读取时错误

回复:
user: user-0
content: 引用 3 楼 user-1 的回复:[quote=引用 2 楼 qq_42850998 的回复:] 二楼方法好像无法解决问题 楼主，不好意思，理解错问题了~~~ 下面代码可供参考~~ void Save(student *L) { 	FILE *fp; 	student *p; 	if ((fp = fopen("信息.txt", "wb")) == NULL) 	{ 		printf("保存失败！\n"); 		return; 	} 	for (p = L->next; p != NULL; p = p->next) 		fwrite(p, sizeof(student), 1, fp);//fwrite()函数返回成功写入项的数量。正常情况下，该返回值就是 nmemb，但如果出现写入错误，返回值会比nmemb小。  	fclose(fp); } void Load(student *&L) {//因为保存时，先保存大，再保存小，为了保持原有顺序，需要在读取时采用尾插法 	student *q; 	q = L; 	FILE *fp; 	if ((fp = fopen("信息.txt", "rb+")) == NULL) 	{ 		printf("读取失败！\n"); 		return; 	} 	CNodeR(q, fp); 	printf("读取成功！\n"); 	fclose(fp); } void CNodeR(student *&L, FILE *fp) { 	student *p = (student *)malloc(sizeof(student)); 	size_t result = fread(p, sizeof(student), 1, fp); 	if (result != 1) 	{ 		return; 	}  	p->next = NULL; 	L->next = p; 	L = p; 	if (!feof(fp)) 		CNodeR(L, fp); }[/quote]  谢谢，不过我发现通过这样改可以解决读取时有 屯 的问题（虽然文件里还有屯， 但是读取正常了）   //修改读取保存语句 fwrite(p,sizeof(student) - sizeof(student *),1,fp);//重点是这句   fread(p, sizeof(student), 1, fp); 	p->next = NULL;    不过这是为什么呢？ 我待会结贴，谢谢！

user: user-1
content: 引用 2 楼 qq_42850998 的回复:二楼方法好像无法解决问题 楼主，不好意思，理解错问题了~~~ 下面代码可供参考~~ void Save(student *L) { 	FILE *fp; 	student *p; 	if ((fp = fopen("信息.txt", "wb")) == NULL) 	{ 		printf("保存失败！\n"); 		return; 	} 	for (p = L->next; p != NULL; p = p->next) 		fwrite(p, sizeof(student), 1, fp);//fwrite()函数返回成功写入项的数量。正常情况下，该返回值就是 nmemb，但如果出现写入错误，返回值会比nmemb小。  	fclose(fp); } void Load(student *&L) {//因为保存时，先保存大，再保存小，为了保持原有顺序，需要在读取时采用尾插法 	student *q; 	q = L; 	FILE *fp; 	if ((fp = fopen("信息.txt", "rb+")) == NULL) 	{ 		printf("读取失败！\n"); 		return; 	} 	CNodeR(q, fp); 	printf("读取成功！\n"); 	fclose(fp); } void CNodeR(student *&L, FILE *fp) { 	student *p = (student *)malloc(sizeof(student)); 	size_t result = fread(p, sizeof(student), 1, fp); 	if (result != 1) 	{ 		return; 	}  	p->next = NULL; 	L->next = p; 	L = p; 	if (!feof(fp)) 		CNodeR(L, fp); }

user: user-0
content: 二楼方法好像无法解决问题

user: user-1
content: 楼主，可以参考一下下面的Add函数代码，输出代码应该没有错~~~ void Add(student *&L) { 	int ch; 	student *p, *q, *temp; 	q = L; 	p = (student *)malloc(sizeof(student)); 	//插入，直接在新增节点时排序   	//学号，姓名，班级，专业，所在院系，性别，身高，体重，出生日期，籍贯 	printf("请输入姓名\n"); 	scanf("%s", p->name); 	printf("请输入学号\n"); 	scanf("%d", &p->num); 	printf("请输入素拓分\n"); 	scanf("%d", &p->score); 	printf("%d\n", p->score);  	printf("请输入班级\n"); 	scanf("%d", &p->_class); 	printf("请输入专业\n"); 	scanf("%s", p->major); 	printf("请输入院系\n"); 	scanf("%s", p->academy); 	rewind(stdin); 	printf("请输入性别(W或M)\n"); 	scanf("%c", &p->sex); 	printf("请输入身高(cm)\n"); 	scanf("%d", &p->height); 	printf("请输入体重(kg)\n"); 	scanf("%d", &p->weight); 	printf("请输入出生日期(年)\n"); 	scanf("%d", &p->birth_year); 	printf("请输入出生日期(月)\n"); 	scanf("%d", &p->birth_month); 	printf("请输入出生日期(日)\n"); 	scanf("%d", &p->birth_day); 	printf("请输入籍贯\n"); 	scanf("%s", &p->birthplace);  	if (L->next == NULL) 	{ 		p->next = L->next; 		L->next = p; 	} 	else 	{ 		temp = L; 		q = q->next; 		while (q != NULL && p->score < q->score) 		{ 			temp = q; 			q = q->next; 		}  		p->next = q; 		temp->next = p; 	} 	printf("是否继续添加？(Y/N)\n"); 	ch = _getch(); 	if (ch == 'Y' || ch == 'y') 		Add(L); }