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;
}//储存链表到文件
我要举报
如果感觉以上信息为低俗/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!
大家都在看
推荐资讯