c语言文件和链表作用,C语言怎么把文件的内容读到链表里面?

C语言怎么把文件的内容读到链表里面?

答案:4  信息版本:手机版

解决时间 2019-10-03 02:13

已解决

2019-10-02 21:37

由于字数限制,我没办法把所有源代码写出来.

下面是我定的一个结构体,链表什么的都写好了!!就链表怎么写入文件,和从文件中读到链表里面该怎么做!

求高手指点!!!

struct book

{

char num[20]; //书号

char name[10]; //书名

int jinjia; //进价

int shoujia; //售价

int shuliang; //库存数量

int shouchu; //售出

struct book *next;

};

最佳答案

2019-10-02 23:11

struct Bookinfo

{

char num[20]; //书号

char name[10]; //书名

int jinjia; //进价

int shoujia; //售价

int shuliang; //库存数量

int shouchu; //售出

};

typedef struct Node_book* pNode_book;

struct Node_book

{

struct Bookinfo bookinfo;

pNode_book next;

};

只存节点的数据域,以二进制文件存放:

int save(struct pNode_book head)

{

if(!head) return 0;

FILE *fp=fopen("info.data","wb");

int i=0;

while(head)

{

fwrite(&head->bookinfo,sizeof(Bookinfo),1,fp);

i++;

head=head->next;

}

fclose(fp);

return i;

}

int readFromFile(struct pNode_book *head)

{

FILE *fp=fopen("info.data","rb");

if(!fp)

{

printf("Can not open the file!\n");

return 0;

}

struct pNode_book pCur=NULL;

fseek(fp,0,SEEK_END);

long end=ftell(fp);

fseek(fp,0,SEEK_SET);

int i=0;

if(ftell(fp)!=end)

{

pNode_book tmpNode=(pNode_book)malloc(sizeof(Node_book));

tmpNode->next=NULL;

fread(&tmpNode->bookinfo,sizeof(Bookinfo),1,fp);

i++;

*head=tmpNode;

pCur=*head;

}

else

{

printf("No record!\n");

return 0;

}

while(ftell(fp)!=end)

{

pNode_book tmpNode=(pNode_book)malloc(sizeof(Node_book));

tmpNode->next=NULL;

fread(&tmpNode->bookinfo,sizeof(Bookinfo),1,fp);

i++;

pCur->next=tmpNode;

pCur=pCur->next;

}

fclose(fp);

return i;

}

//在vc++下编译。如果在TC下,可能还要做些小修改。

//我在记事本上写的,你调试下吧!

//有问题Hi我!

全部回答

1楼

2019-10-03 03:01

(1)你没给出struct suoju结构的定义,不知道suoju的成员danci应该是字符数组还是指针?

(2)danci如果是指针, 需要用malloc分配内存

current->danci=(char*)malloc((nchar+1)*sizeof(char));

(3) fread(¤t,sizeof(char),sizeof(struct suoju),f1)的第一个参数(¤t,表示什么,应该是

current->danci才对;

(4)fread(¤t,sizeof(char),sizeof(struct suoju),f1)的第3个参数不应该是sizeof(struct suoju),应该是你要写入的字符个数nchar才对;

(5)printf("%s",current->danci);之前加一句current->danci[nchar]=0;

(6) 还要检查你打开文件是否正确,fopen().

(7)如果你读的是汉字,注意一个汉字2占字符, (例如读2个汉字nchar =4)。

修改后,看看对不对。

else

{

rewind(f1);

long nchar=10;

current = (struct suoju *)malloc(sizeof(struct suoju));//创建一个节点

current->danci=(char*)malloc((nchar+1)*sizeof(char)); // 如果你的danci是指针

if(head == null)

{

head = current;//头指针

}

current->next = null;

fread(current->danci,sizeof(char),nchar,f1);//写入链表

prev = current;//指向前一个节点

current->danci[nchar]=0;

printf("%s",current->danci);//输出一个字符串

}

2楼

2019-10-03 01:21

首先设计文件格式:节点数+节点1内容+节点2内容+...

写入文件bool WriteToFile(FILE*fp, struct book *head):先写入节点数,从链表头依次至链表尾,将每一个节点的数据(除next指针外)写入文件;

从文件读struct book *ReadFromFile(FILE*fp):先读入节点数,动态创建一个链表,节点数为读入节点数,接着依次读入文件中内容并赋值给相应的节点

3楼

2019-10-03 00:22

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

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

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

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;

}//储存链表到文件

我要举报

如果感觉以上信息为低俗/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!

大家都在看

推荐资讯

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值