中易网

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

答案:4  悬赏:10  
解决时间 2021-01-26 05:03
C语言怎么把文件的内容读到链表里面?
最佳答案
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我!
全部回答
写入文件当然要用专门的 文件操作函数 fprintffscanffread fwrite fputs fgets ……、既然你有很多的节点,当然是用循环 让指针挨个遍历个个节点,每到一个,把结构体的个个变量依次写入、至于是存二进制的还是文本形式的。就看你自己的了。
首先设计文件格式:节点数+节点1内容+节点2内容+...
写入文件bool WriteToFile(FILE*fp, struct book *head):先写入节点数,从链表头依次至链表尾,将每一个节点的数据(除next指针外)写入文件;
从文件读struct book *ReadFromFile(FILE*fp):先读入节点数,动态创建一个链表,节点数为读入节点数,接着依次读入文件中内容并赋值给相应的节点

当把链表已经确定的时候,就可以依次存入文件。
和平时链表的遍历一样,每读取一个节点内容就进行一次存入操作。
不过要注意几个部分的检查:
内存空间是否分配成功
是否成功存入到文件中
在工作完成之后,是否将以后不会用到的变量清空和删除。


按照问题要求的代码如下:
Consumer* read_list()
{
FILE *fp;
if ((fp = fopen("CONSUMER.dat", "rb")) == NULL)
{
printf("无法读取 CONSUMER.dat ");
return NULL;
}
int sign;
Consumer *s,*p,*head;


head= (Consumer*)malloc(SIZE_C);
if (head == NULL)
{
printf("读取失败!内存空间申请不足! ");
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! ");
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;
}//储存链表到文件
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
FGO没英灵 能换英灵正装吗我刚刚才开始玩FGO
求殇夜千年的《秦始皇的小妻子》百度云下载,
双频激光干涉测量与普通激光干涉测量有什么不
广东省中山市繁华地在哪
关于陌生的句子
学习STL模板库的最佳途径是什么?有没有谁能
统计机构和统计人员独立行使哪些法定职权
为啥同样是荣耀8有的就可以更新系统到8.0我的
如何加强我国开发园区土地利用与管理
跑步新手和跑步高手有什么区别
剑灵六人三本是啥意思
左右眼都近视425度+50散光,该配多少度框架眼
高铁g125次06车15c 在哪里
张师傅到泰国游览大皇宫,带了6000元人民币去
用堪组四字词语
推荐资讯
求助关于CMD下命令
oppor7plus手机来信息有语音提示怎么解除
渝bgj999是什么车
新西兰Visitor Visa上expiry date travel14&#
曹冲称象课件
1000块买的狗,赚了亏了
office 比2003更高一版的是?现在最新版是201
论你对舞蹈的认识及作用,要1500字。 不要太
怎样给牛羊肉喂料(是烧烤)???
爸爸钓鱼补充时间、地点,把句子写具体。
帮忙翻译几个句子,英语。
军人订婚后感觉双方不合适退婚彩礼可以要回来
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?