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;

#include<stdio.h> #include<stdlib.h> #include<malloc.h> struct subject long num; // 课程编号 char name[20]; // 课程名称 char kind[15]; // 课程性质 int period_1; // 授课学时 int c_period_2; // 实验或上机学时 float score; // 课程学分 int term; // 开课学期 struct subject *next; ; struct subject *c_head; void save() // 课程数据存入文件 FILE *fp; struct subject *p1=c_head; if((fp=fopen("wan.txt","w"))==NULL) printf("open error\n"); return; for(;p1;p1=p1->next) fprintf(fp,"%ld\n%s\n%s\n%d\n%d\n%f\n%d\n",p1->num,p1->name,p1->kind,p1->period_1,p1->period_2,p1->score,p1->term); fclose(fp); void input() // 录入课程信息(动态链表) struct subject *p1,*p2; n=5; //录入5条记录 clrscr(); printf("Please input the information of course:\nnum\tname\tkind\tperiod_1\tperiod_2\tscore\tterm\n"); 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; printf("\nNow press any key to save "); getch(); save(); return; int main() float pyy,*yy=&pyy; input(); return 0;
//我的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; //建立链表试试这个

参考技术A 才学习啊,觉得C挺有趣的。追问

你也学C吗?上大一呢?

追答

不是啊,就是想学了。

追问

你今年多大啊?对计算机有兴趣的话,可以交个朋友吧。

追答

可以啊,加QQ811791379

参考技术B cscscs追问

正经一点好不好

参考技术C 有报错吗?追问

没有报错。你可以运行一下试试。

追答

我运行有报错啊

追问

我这是截取的我的项目中的一段程序。其中m,n之类的已经定义过了。还有,要在TC下运行,在VC下肯定要出错的。

以上是关于C语言怎么把文件的内容读到链表里面?的主要内容,如果未能解决你的问题,请参考以下文章

C语言问题,求解释(关于动态链表和文件写入):

C语言如何将链表里的值写入文件

c语言删除文件中的指定的一行数据怎么做

C语言文件读取fscanf(),该怎么处理

c语言读取文件数据乱码

C语言怎么存链表形式的结构体文件?