其实也简单,就是自定义malloc函数,使得链表在分配空间时在一个限定区段内(比如0000~FFFF)进行分配,即你已经知道了链表可能存在的最大空间,然后保存时,直接用指针:
fwrite()把整个区段写进去,然后再记录根地址即可;
调用时,先把整个区段读进去,然后把根地址读出来作为根,这样整个链表一共用两个指令就完成读写 *** 作了。
不要觉得有多无赖可笑,现代 *** 作系统:WINXP
/
VISTA
/
WIN7
/
LINUX
/
OS
X等等,其快速“休眠”功能完全就是上面的解法,就是把内存和寄存器状态一并写入磁盘,这个方法非常快,而且不会出错,但是能把教你数据结构的老师气得吐血。
有人说这样产生的文件会很大,大怕什么,压缩一下不就行了?反正里面实际上放置的是一个稀疏矩阵,压缩后的结果可能比楼上产生的文件更小。
/*要点:把数据内容和链表结构分开,存盘的时候,只存数据,不存指针,这样你明白了吧?*/#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>
#define
szSTR
32
struct
TBook
{
int
number
/*书代号*/
char
title[szSTR]
/*书名*/
char
author[szSTR]/*作者*/
int
year/*出版时间*/
float
price
/*单价*/
int
storage
/*库存*/
int
export
/*借出*/
int
total
/*总量*/
}
struct
TLink
{
struct
TBook
book
struct
TLink
*
next
}
struct
TLink
*
Load(char
*
file)
{
FILE
*
f
=
0
struct
TBook
book
int
r
=
0
struct
TLink
*
n
=
0,
*
data
=
0
if(!file
||
!data)
return
0
f
=
fopen(file,
"rb")
if(!f)
return
0
while(!feof(f))
{
r
=
fread(&book,
sizeof(book),
1,
f)
if
(r
<
1)
break
n
=
(struct
TLink
*)malloc(sizeof(*n))
memset(n,
0,
sizeof(*n))
memcpy(n,
&book,
sizeof(book))
n->next
=
data
data
=
n
}
fclose(f)
return
data
}
void
Save(char
*
file,
struct
TLink
*
data)
{
FILE
*
f
=
0
struct
TLink
*
n
=
0
if(!file
||
!data)
return
f
=
fopen(file,
"wb")
if(!f)
return
n
=
data
while(n)
{
fwrite(n,
sizeof(struct
TBook),
1,
f)
n
=
n->next
}
fclose(f)
}
int
main(void)
{
struct
TLink
*
books
=
0
books
=
Load("books.txt")
Save("books.bak",
books)
return
0
}
当把链表已经确定的时候,就可以依次存入文件。
和平时链表的遍历一样,每读取一个节点内容就进行一次存入 *** 作。
不过要注意几个部分的检查:
内存空间是否分配成功
是否成功存入到文件中
在工作完成之后,是否将以后不会用到的变量清空和删除。
按照问题要求的代码如下:
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
}//储存链表到文件
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)