C语言从文件打开链表,要用指针

C语言从文件打开链表,要用指针,第1张

当把链表已经确定的时候,就可以依次存入文件

和平时链表的遍历一样,每读取一个节点内容就进行一次存入 *** 作。

不过要注意几个部分的检查:

内存空间是否分配成功

是否成功存入到文件中

在工作完成之后,是否将以后不会用到的变量清空和删除。

按照问题要求的代码如下:

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时还没没岩有产生读动作呢,造成最后一次读到闷信文件外面去了……


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12261839.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存