关于C语言中,链表数据的文件储存和提取。

2024-12-31 07:12:53
推荐回答(2个)
回答1:

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

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

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

  1. 内存空间是否分配成功

  2. 是否成功存入到文件中

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


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

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;

}//储存链表到文件

回答2:

do
{
fwrite(pinput,sizeof(struct fac),1,fp);
pinput=pinput->next;
}
while(pinput->next!=NULL);
这个理解了,你那个就不难解决了啊。现在你要写最后一个结点信息,加入执行
pinput=pinput->next;这句后pinput就指向了最后一个结点,此时你还没写它。可是接下来的
while判断就让你退出了循环,你可以将while改成while(pinput==NULL);

第二个问题,可以用while循环啊,判断条件就是读到文件尾部就退出。
while(!feof(fp))
{
fscanf(); //你从磁盘读数据,fp会自动移动
}
这种形式。