和平时链表的遍历一样,每读取一个节点内容就进行一次存入 *** 作。
不过要注意几个部分的检查:
内存空间是否分配成功
是否成功存入到文件中
在工作完成之后,是否将以后不会用到的变量清空和删除。
按照问题要求的代码如下:
Consumer* read_list()
{
FILE *fp
if ((fp = fopen("CONSUMER.dat", "rb")) == NULL)
{
printf("无法读取 CONSUMER.dat\n")
return NULL
}
int sign
Consumer *s,*p,*head
head= (Consumer*)malloc(SIZE_C)
if (head == NULL)
{
printf("读取失败!内存空间申请不足!\n"缓手)
return NULL
}
fseek(fp, 0, SEEK_END)
if (ftell(fp) == 0)
{
return NULL
}
p = head
p->next = NULL
while (feof(fp))
{
s = (Consumer*)malloc(SIZE_C)
//fread(s, SIZE_C, 1, fp)
fread(s, sizeof(char), SIZE_C, fp)
p->next = s
p = s
p->next = NULL
}
fclose(fp)
return head
}//读取文件到链表
int save_consumer(Consumer *p)
{
FILE *fp
Consumer *head
head = p//p为已经构建好的链表
//if ((fp = fopen("CONSUMER.dat", "ab+")) == 迹正NULL)
if ((fp = fopen("CONSUMER.dat", "wb")) == NULL)
{
printf("无法打开 CONSUMER.dat!\n")
return -1
}
while (p != NULL)
{
//fwrite(p, SIZE_C, 1, fp)
fwrite(p, sizeof(char), SIZE_C, fp)
p = p->next
}
fclose(fp)
return 1
}//储扰州嫌存链表到文件
错误地方:将fwrite(q,sizeof(STU),10,fp)改为
fwrite((char *)q,sizeof(STU),10,fp)就可以了
我都已经测试通过了差配.
是不是你在读没冲取文件的时候方法不对.我是按如下方法读取的
int fd
fd = open("STUDENT.TXT", O_RDONLY)
char buf[256]
int len
memset(buf, 0, 256)
len = read(fd, buf, 256)
ST stmemset((char *)&st, 0, sizeof(ST))
memcpy((char *)&st, buf, len)
close(fd)
下面虚察指为运行结果:
Please input number of node:1
Input date:
Please input information like this:060229 wenbiao 99 98 97
input num:23
input name:wwwww
input Chinese:1
input English:2
input Math:3
读取出来的结果为p st
$1 = {num = "23\000\000", name = "pengsong\000", Chinese = 1, English = 2, Math = 3, next = 0x0}
完全正确
指针p指向一个指定空间的地址(指针类型和所指向的空间类型要相同,比如说int类型指针指孝裤向int类型数据,结构体指针指向对应的malloc申请的空间) p是指散弯向数据冲慎闷空间对应的地址free(p)是释放掉malloc申请的空间,但是p指向的地址不会变,要想改变p的指向 必须给它重新赋值
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)