C语言怎么把文件的内容读到链表里面?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言怎么把文件的内容读到链表里面?相关的知识,希望对你有一定的参考价值。
由于字数限制,我没办法把所有源代码写出来.
下面是我定的一个结构体,链表什么的都写好了!!就链表怎么写入文件,和从文件中读到链表里面该怎么做!
求高手指点!!!
struct book
char num[20]; //书号
char name[10]; //书名
int jinjia; //进价
int shoujia; //售价
int shuliang; //库存数量
int shouchu; //售出
struct book *next;
;
当把链表已经确定的时候,就可以依次存入文件。
和平时链表的遍历一样,每读取一个节点内容就进行一次存入操作。
不过要注意几个部分的检查:
内存空间是否分配成功
是否成功存入到文件中
在工作完成之后,是否将以后不会用到的变量清空和删除。
按照问题要求的代码如下:
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;
//储存链表到文件
参考技术A 写入文件当然要用专门的 文件操作函数 fprintf fscanf fread fwrite fputs fgets ……、既然你有很多的节点,当然是用循环 让指针挨个遍历个个节点,每到一个,把结构体的个个变量依次写入、至于是存二进制的还是文本形式的。就看你自己的了。 参考技术B 首先设计文件格式:节点数+节点1内容+节点2内容+...写入文件bool WriteToFile(FILE*fp, struct book *head):先写入节点数,从链表头依次至链表尾,将每一个节点的数据(除next指针外)写入文件;
从文件读struct book *ReadFromFile(FILE*fp):先读入节点数,动态创建一个链表,节点数为读入节点数,接着依次读入文件中内容并赋值给相应的节点本回答被提问者采纳 参考技术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我!
C语言问题,求解释(关于动态链表和文件写入):
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<malloc.h>
struct subject
long c_num; // 课程编号
char c_name[20]; // 课程名称
char c_kind[15]; // 课程性质
int c_period_1; // 授课学时
int c_period_2; // 实验或上机学时
float c_score; // 课程学分
int c_term; // 开课学期
struct subject *next;
;
void c_save() // 课程数据存入文件
FILE *fp;
char a[15];
struct subject *p=c_head;
printf("\nPlease input the file's name: ");
scanf("%s",a);
getchar();
if((fp=fopen(a,"wb"))==NULL)
printf("open error\n");
return;
for(;p;p=p->next)
fwrite(p,sizeof(struct subject),1,fp);
fclose(fp);
void c_input() // 录入课程信息(动态链表)
struct subject *p1,*p2;
n=0;
clrscr();
printf("Please input the information of course:\nnum\tname\tkind\tperiod_1\tperiod_2\tscore\tterm\n");
p1=p2=(struct subject *)malloc(sizeof(struct subject));
scanf("%ld%s%s%d%d%f%d",&p1->c_num,p1->c_name,p1->c_kind,&p1->c_period_1,&p1->c_period_2,&p1->c_score,&p1->c_term);
while(p1->c_num)
m+=1;
if(n==1) c_head=p1;
else p2->next=p1;
p2=p1;
p1=(struct subject *)malloc(sizeof(struct subject));
scanf("%ld%s%s%d%d%f%d",&p1->c_num,p1->c_name,p1->c_kind,&p1->c_period_1,&p1->c_period_2,&p1->c_score,&p1->c_term);
p2->next=NULL;
printf("\nNow press any key to save ");
getch();
c_save();
return;
int main()
float pyy,*yy=&pyy;
c_input();
return 0;
编程环境TC3.0
文件可以创建,但是写入后是空白的。
补充,全局变量定义过 struct subject *c_head;
//我的VC有点问题,没有运行……仅做参考追问
看着有点晕,你直接指处我哪里有错误,该怎么改吧。。。还有,这是在TC下编的。
追答你的链表没有完整的建立起来,没有头……中间的连接有问题……
追问c_head就是链表头啊,中间链接嘛···我没看出问题来·····反正错得很诡异,我自己感觉文件写入那里有问题,就是发现不了···
追答c_head=p1=(struct subject *)malloc(sizeof(struct subject));
scanf("%ld%s%s%d%d%f%d",&p1->num,p1->name,p1->kind,&p1->period_1,&p1->period_2,&p1->score,&p1->term);
while(n--)
p2=(struct subject *)malloc(sizeof(struct subject));
p1->next=p2;
p1=p2;
scanf("%ld%s%s%d%d%f%d",&p1->num,p1->name,p1->kind,&p1->period_1,&p1->period_2,&p1->score,&p1->term);
p1->next=NULL; //建立链表试试这个
你也学C吗?上大一呢?
追答不是啊,就是想学了。
追问你今年多大啊?对计算机有兴趣的话,可以交个朋友吧。
追答可以啊,加QQ811791379
参考技术B cscscs追问正经一点好不好
参考技术C 有报错吗?追问没有报错。你可以运行一下试试。
追答我运行有报错啊
追问我这是截取的我的项目中的一段程序。其中m,n之类的已经定义过了。还有,要在TC下运行,在VC下肯定要出错的。
以上是关于C语言怎么把文件的内容读到链表里面?的主要内容,如果未能解决你的问题,请参考以下文章