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

我是这样想的,希望高手能指正一下。先建立一个链表,然后把链表的每一个结点都保存在文件中。下次需要数据的时候,从文件中按照结构体定义的结构,一块一块的把数据读出来。我自己写... 我是这样想的,希望高手能指正一下。
先建立一个链表,然后把链表的每一个结点都保存在文件中。下次需要数据的时候,从文件中按照结构体定义的结构,一块一块的把数据读出来。
我自己写了一个小程序,但是运行起来有故障,希望高手能帮忙看看是什么地方错了。谢谢啊~~~~
或者高手能提供一个更好的思路来解决问题也可以。我是一个初学者,还需要多多指教。
程序比较多,不好意思,给10个金币。
程序如下:
1,链表保存程序(出现的问题是,最后一个数据保存不进去)
#include "stdafx.h"
#include "stdlib.h"
#define N 5
int main()
{
struct fac
{
int data;
struct fac* next;
}*phead;
phead=(struct fac *)malloc(sizeof(struct fac));
FILE *fp=fopen("d:\\ctest\\exam7","wb");
phead->next=NULL;
struct fac *ptail=phead;
int i,value;
for(i=0;i<N;i++)
{
struct fac *p=(struct fac*)malloc(sizeof(struct fac));
printf("%dvalue=",i);
scanf("%d",&value);
p->data=value;
ptail->next=p;
p->next=NULL;
ptail=p;
}
struct fac *pinput;
pinput=phead->next;
do
{
fwrite(pinput,sizeof(struct fac),1,fp);
pinput=pinput->next;
}
while(pinput->next!=NULL);
fclose(fp);
2,链表输出程序(问题是,如果我不用for循环语句,而是用while语句。因为假设如果我不知道数据的明确的个数,for语句就用不了了。现在的这个程序是我知道数据一共5个)
#include "stdafx.h"
#include "stdlib.h"
int main()
{
struct fac
{
int data;
struct fac *next;
}*phead;
int i;
FILE *fp=fopen("d:\\ctest\\exam7","rb");
struct fac *p;
phead=(struct fac*)malloc(sizeof(struct fac));
p=(struct fac*)malloc(sizeof(struct fac));
fread(p,sizeof(struct fac),1,fp);
for(i=0;i<5;i++)
{
printf("%d\n",p->data);
p=p->next;
p=(struct fac*)malloc(sizeof(struct fac));
fread(p,sizeof(struct fac),1,fp);

}
}
展开
 我来答
乐跑小子
2016-01-12 · TA获得超过1.5万个赞
知道大有可为答主
回答量:1.1万
采纳率:7%
帮助的人:4709万
展开全部

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

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

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

  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;

}//储存链表到文件

光点科技
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
爱生活的翟先森
推荐于2018-02-28 · TA获得超过163个赞
知道答主
回答量:50
采纳率:0%
帮助的人:36.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会自动移动
}
这种形式。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式