结构体(采用动态链表)的储存读取,以及fread函数的使用。
答案:1 悬赏:20 手机版
解决时间 2021-02-16 06:13
- 提问者网友:缘字诀
- 2021-02-16 01:51
结构体(采用动态链表)的储存读取,以及fread函数的使用。
最佳答案
- 五星知识达人网友:一秋
- 2021-02-16 02:03
完整测试代码如下,思路就是从文件读出的时候重建链表。
#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是内存里的地址,不是文件。文件读写的位置由文件位置指针确定,这个指针在读写文件时会自动移动
#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是内存里的地址,不是文件。文件读写的位置由文件位置指针确定,这个指针在读写文件时会自动移动
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯
正方形一边上任一点到这个正方形两条对角线的 |
阴历怎么看 ? |