永发信息网

结构体(采用动态链表)的储存读取,以及fread函数的使用。

答案:1  悬赏:20  手机版
解决时间 2021-02-16 06:13
结构体(采用动态链表)的储存读取,以及fread函数的使用。
最佳答案
完整测试代码如下,思路就是从文件读出的时候重建链表。
#include "stdio.h"
#include "malloc.h"
#include "string.h"
 
struct Student       
{
 char num[12]; 
 char name[10]; 
 char clas[20]; 
 char sex[4]; 
 char birth[20]; 
 struct Student *next;     //存放结构体指针
};
 
void Save_To_File(Student *pHead);  //(给定表头pHead作为参数)
void Read_From_File(Student *pHead);     //(给定表头pHead作为参数) 
 
void main()
{
 int a;
 Student *pHead, *p, *pNext;
 
 // 表头
 pHead = (Student *)malloc(sizeof(Student));
 strcpy(pHead->birth, "1");
 strcpy(pHead->clas, "1");
 strcpy(pHead->sex, "1");
 strcpy(pHead->num, "1");
 strcpy(pHead->name, "1");
 
 p = (Student *)malloc(sizeof(Student)); // 第2个节点
 pHead->next = p;
 strcpy(p->birth, "2");
 strcpy(p->clas, "2");
 strcpy(p->sex, "2");
 strcpy(p->num, "2");
 strcpy(p->name, "2");
 
 pNext = (Student *)malloc(sizeof(Student)); // 第3个节点
 p->next = pNext;
 p = pNext;
 strcpy(p->birth, "3");
 strcpy(p->clas, "3");
 strcpy(p->sex, "3");
 strcpy(p->num, "3");
 strcpy(p->name, "3");
 p->next = NULL;  // 终结链表
 
 Save_To_File(pHead);
 
 free(pHead); // 为测试,仅释放 pHead,其他节点暂时不管了
 
 pHead = (Student *)malloc(sizeof(Student));
 Read_From_File(pHead);
 
 // 输出看是否正确读出
 p = pHead;
 while (p)
 {
  printf("Num=%s, Name=%s, Clas=%s, Sex=%s, Birth=%s
", p->num, p->name, p->clas, p->sex, p->birth);
  p = p->next;
 }
}

void Save_To_File(Student *pHead)     //(给定表头pHead作为参数) 
{  
 FILE* fp;  
 fp = fopen("stud.dat", "wb");  
 Student* p = pHead;  
 while (p)  
 {   
  fwrite(p, sizeof(Student),1, fp); // 这里不应该用sizeof(struct Student),意思不一样
  p = p->next; 
 }  
 printf("所有信息已存储至文件Stud.dat。
"); 
 fclose(fp); 
}
 
void Read_From_File(Student *pHead)     //(给定表头pHead作为参数) 
{
 FILE* fp;
 Student *p, *pNext;
 fp = fopen("stud.dat", "r");
 p = pHead;
 while (fread(p, sizeof(Student), 1, fp))
 {
  if (p->next != NULL) // 如果读出的不是最后一个结点,为下一个节点分配空间并处理
  {
   pNext = (Student *)malloc(sizeof(Student));
   p->next = pNext;
   p = pNext;
  }
 }
 printf("所有信息已读出到链表。
");
 fclose(fp);追问好像真的可以!!! 点一个赞 fread(buffer,xx,xx,xx) 这里的buffer是指把数据读出来的后存放的地点吗?我一直以为这个buffer是数据在文件中的地址追答buffer是内存里的地址,不是文件。文件读写的位置由文件位置指针确定,这个指针在读写文件时会自动移动
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
今晚F1比利时站正赛哪个台播?
求三角形面积长52米,另一边长十五六米,底是
徐志摩的《再别康桥》中的“康桥”指的是什么
李时珍在1951年被世界和平理事会尊崇为世界文
她说不用发那么钱几块就行了,怎么回答好呢
想找个人多的游戏。
想给女票买一双女款的詹姆斯十二代战靴,但是
太太乐鲜鸡汁好不好,口味如何
He never believed that true love existed.
2017年东部贫困人口分布
为什么貂皮有臭臭的味道?
(x+3)×5+3x=x+71
橙光七个矮人,为啥买了所有角色篇,还是不能
意林2015年第1期下面的所有语录
简诗缇地址在什么地方,想过去办事
推荐资讯
—Ihearitwillraintomorrow.—It_______true.
年前买iPhonex 现在买与在等两个月买
5x(X+2)二32是怎么做
switchport trunk native vlan vlan_# 这句何
佛教剃度有哪些仪规?
谁知道今年北服改了政策是怎么回事?艺术设计
阿里云服务器到期,我公司的阿里企业邮箱还能
犀牛如何做背景图与场景物的结合?
泉州老年大学金山教学点在什么地方啊,我要过
试编写程序,完成两个16位数的减法:7F4DH-2B
出生2014九月初三出生孩子是什么命
60斤金毛被人揪耳朵往前走 但它不顺从 结果叫
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?