和平时链表的遍历一样,每读取一个节点内容就进行一次存入 *** 作。
不过要注意几个部分的检查:
内存空间是否分配成功
是否成功存入到文件中
在工作完成之后,是否将以后不会用到的变量清空和删除。
按照问题要求的代码如下:
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
}//储扰州嫌存链表到文件
//很简单,给个单链表的例子,首先定义链表成员的结构体 ;struct filetext{
char buf[BUFSIZE]
struct filetext *next
};
//读取文件,并插入进链表的函数,filename为要读取的文件名,head为链表的头节点,函数返回插入新节点后链表的头节点;
struct filetext * readfile(char * filename,struct filetext * head)
{
struct filetext * new = (struct filetext *)malloc(sizeof(struct filetext))//定义一个新成员,并给它分配空间
FILE * fp//读取文件的文件流
struct filetext * p =head//定义一个p,用来寻找链表中最后一个节点
if((fp=(fopen(filename,"r+")))==NULL)
{
//如果打开文件失败,返回head,并提示
printf("open file failure")
return head
}
//然后开始读取文件,放到new的buf中
if(fread(new->buf,BUFSIZE,1,fp)<1)
{
//如果读取失败念盯,提示,并返回head
printf("read file failure")
return head
}
fclose(fp)
//文件读取完后,进行链表 *** 作
if(!head)//如果传进仔孙和来的head是个空指针,那么新指针就作为头节点返回
{
new->next = NULL
return new
}
while(p->next) p = p->next//把p移凯冲动到最后一个节点
p->next = new//p的下一个节点为new
new->next = NULL//new的下一个节点为空
return head
}
//这样这个函数就完成了,可以写个主函数,定义一个头节点,完成。
我一猜就是那种问题,看了代码果然是。把while(!feof(fp))改为while(1),在fread(p,sizeof(struct link),1,fp)后加一句if(feof(fp)) break(或return)。以上是按你的代码思路改的,应该说代码还有问题,比如怎么最后没有释放申请的枯罩御空间(这一点很重要)?产生乱码原因是feof要在逻辑上紧跟的读文件动作之后才能正确起作用,而你的写法在第一次进入while时还没没岩有产生读动作呢,造成最后一次读到闷信文件外面去了……欢迎分享,转载请注明来源:内存溢出
评论列表(0条)