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

我用动态链表输入了很多信息,但是最后怎么才能把他们保存到文件里、以及下次要打开这个文件时、应该怎么打开、关于save 和load这两个函数要 怎么去写

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct datanode {
char name[24];
char phone[12];
// ......
struct datanode *next;
}*pNode,*LinkList,Node;

LinkList getEmptyList() {
LinkList head = (pNode)malloc(sizeof(Node));
head->next = NULL;
return head;
}

void addNode(LinkList head, pNode pnode) {
pnode->next = head->next;
head->next = pnode;
}

void writeFile(LinkList head) {
FILE *outf;
pNode p = head->next;
if((outf = fopen("data.txt","wt")) == NULL) {
printf("不能打开数据文件。\n");
exit(1);
}
while(p) {
fwrite(p,sizeof(Node),1,outf);
p = p->next;
}
fclose(outf);
}

int main() {
char name[24],phone[12];
// ......
pNode p;
LinkList head = getEmptyList();
printf("姓名 联系电话\n");
while(scanf("%s%s",name,phone) == 2) {
p = (pNode)malloc(sizeof(Node));
strcpy(p->name,name);
strcpy(p->phone,phone);
addNode(head,p);
printf("姓名 联系电话(<Ctrl + Z> <ENTER> 结束)\n");
}
writeFile(head);
return 0;
}

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2018-02-27
先定义一个全局的文件 FILE *fp;
读文件
if((fp=fopen("student.txt","r"))==NULL)/*打开文件*/
{ printf("文件打不开!\n");
exit(1);
}
while(!feof(fp))
{ p=(Student *)malloc(sizeof(Student));
fscanf(fp,"%s%s%s%d%d%d%d%d%d",
p->num,p->name,p->clas,&p->xf.jch,&p->xf.zhy,&p->xf.xx,&p->xf.rw,&p->xf.shy,&p->xf.zx);
p->next=sx->next;
p->prior=sx;
if(sx->next!=NULL)
p->next->prior=p;
sx->next=p;
}
fclose(fp);
写文件
if((fp=fopen("student.txt","w"))==NULL)
{
printf("文件打不开!\n");
exit(1);
}
while(p!=NULL)
{
fprintf(fp,"\n%s %s %s %d %d %d %d %d %d",
p->num,p->name,p->clas,p->xf.jch,p->xf.zhy,p->xf.xx,p->xf.rw,p->xf.shy,p->xf.zx);
p=p->next;
}
fclose(fp);追问

我用了两个动态链表~~分别保存了不同的结构体里面的信息~~是不是在写这两个函数的时候fprintf和fscanf都得写双份、还有while(!feof(fp))这里没看懂~~能否详细解释下

追答

一、你用了两个链表,好比两个数据库表,肯定是要写两个分别读取和保存对应文件,因为两个数据结构不同,无法重用代码;
二、fp是一个指针,我相信你已经看出来了,while(!feof(fp))是将指针左移并判断指向的地址是否有数据,如果有数据就继续操作,直到没有数据后退出循环,循环里的代码是先申请一个结构的空间,将数据读到这个这个结构变量里,然后再将这个变量插入到结构链表里,如此循环将所有数据读取插入链表就完成了文件的读取操作

本回答被提问者和网友采纳
第2个回答  2013-05-16
看一下C语言的基本文件操作吧。。建议使用fwrite(),遍历链表的时候写入就OK。打开文件和这个相反,先看下基础吧。

C语言题目,把一个链表写入指定文件,以备下次使用,现在只要一个写入文...
在point函数下加入以下函数就可以了:void Output_Flie (struct student *p){FILE *fp;fp = fopen ("student.txt", "a"); \/\/向指定文件中追加内容if (fp == NULL){printf ("文件打开失败!\\n");exit (-1);}fprintf (fp, "%d %s %s %lf\\n", p->num, p->name, p->job,...

关于C语言中,链表数据的文件储存和提取。
return 1;}\/\/储存链表到文件

c语言把单链表的操作和定义放入头文件LinkedList.h要怎么做
.h是声明函数和变量使用的,再建立一个.c文件,把函数定义放在里面,同时包含.h文件,.h文件:include <stdio.h> include <stdlib.h> include <string.h> typedef structSingleNode { ElemType data;structSingleNode *next;}SingleLinkedList,*Linklist;\/\/定义单链表结点的结构体 void ListInitialize(...

c语言中,动态链表可不可以用二进制格式保存到文件中?
1 将链表按节点存放到二进制文件中,是否存储指针域均可。2 读取时,每次读取一个节点的数据,指针域置空;3 将每个节点的数据,按照存储的顺序(从头到尾,或从尾到头),重新分配节点资源,并形成有效链表。

[c] _ c中的单链表与文件读写
我们根据单链表的性质.插入只需要三步,创建一个新节点.将插入前一个节点指向新节点,将新节点的指针域指向后一个节点.当然,如果你想把功能写全,还可以设计查找函数,匹配函数.等等.这些同样,都是基于链表的遍历的.只要你理解了链表的遍历,相信这些函数你都可以很轻松的实现.文件读写的详细操作和原理,...

c语言,将文件的数据用链表处理需要将文件的数据全部先导入链表吗?
首先若是追加文件内容 C语言以a方式打开文件可直接追加在末尾,不需要读取文件的内容;再者,若是删除和修改我说一下我的做法:要删除和修改首先你要找到要删除和修改的位置,所以一般会把文件的内容读取到结构体数组或者链表中来,在载入的文件内容中查找你要删除的内容,然后执行删除,最后重新写入文件...

编写c语言程序,从文件中读取数据顺序存储到单链表l中,文件中数据之间用...
在c语言中,创建单链表需要使用到malloc函数动态申请内存;文件的读写需要首先使用fopen函数打开文件,然后使用fscanf,fgetc, fgets,fprintf,fputc,fputs等函数读写函数,最后读写完毕要使用fclose函数关闭函数。下面的源程序展示了关于单链表如何从文件中读取数据和往文件里存入数据。include<stdio.h> inclu...

c语言的就行,谢啦!!!网上的都用不了!!!救命啊!!!
=1) \/*将链表中的信息写入文件中*\/ printf("\\n写入文件失败!\\n请重新启动本系统!\\n"); p0=p; p=p->next; free(p0); \/*释放所有结点*\/}h_reader=NULL;fclose(fp_reader); \/*关闭文件*\/}void Save_Book() \/*保存图书信息*\/{FILE *fp_book; \/*创建文件型指针*\/BK *p,*p0;p=h_book;if(...

c语言如何从文件读入,并存放在链表中
FILE * fp;\/\/读取文件的文件流 struct filetext * p =head;\/\/定义一个p,用来寻找链表中最后一个节点 if((fp=(fopen(filename,"r+")))==NULL){\/\/如果打开文件失败,返回head,并提示 printf("open file failure");return head; } \/\/然后开始读取文件,放到new的buf中 if(fread(new->...

C语言编程,把第一个文件内容读出来倒着写入另一个文件。可以用链表或...
\/\/手动建立一个res.txt,文件,输入字符串 \/\/再建立一个空白文件dst.txt include <stdio.h> include <stdlib.h> include <string.h> void main(){ FILE *fp;char a[100];if((fp=fopen("res.txt","r"))==NULL){ printf("文件打开错误");exit(0);} int i=0;char c=fgetc(fp);w...

相似回答