C语言把文件内容放入链表,c语言:怎么把文件的数据读到运行内存,文件里的内容是一个链表哦...

最佳答案

当把链表已经确定的时候,就可以依次存入文件。

和平时链表的遍历一样,每读取一个节点内容就进行一次存入操作。

不过要注意几个部分的检查:

内存空间是否分配成功

是否成功存入到文件中

在工作完成之后,是否将以后不会用到的变量清空和删除。

按照问题要求的代码如下:

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;

}

最佳答案由网友  朱小亲  提供

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
链表存入文件需要进行序列化操作,即将链表中的数据转化为二进制数据流,然后写入文件中。读取文件中的数据则需要进行反序列化操作,即将文件中的二进制数据流转化为链表中的数据。 下面是一个示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct node { char data[50]; struct node* next; } Node; void add(Node** head, char* data) { Node* new_node = (Node*)malloc(sizeof(Node)); strcpy(new_node->data, data); new_node->next = NULL; if (*head == NULL) { *head = new_node; } else { Node* cur = *head; while (cur->next != NULL) { cur = cur->next; } cur->next = new_node; } } void serialize(Node* head, char* filename) { FILE* file = fopen(filename, "wb"); Node* cur = head; while (cur != NULL) { fwrite(cur->data, sizeof(char), strlen(cur->data) + 1, file); cur = cur->next; } fclose(file); } Node* deserialize(char* filename) { FILE* file = fopen(filename, "rb"); Node* head = NULL; char data[50]; while (fread(data, sizeof(char), 50, file) != 0) { add(&head, data); } fclose(file); return head; } int main() { Node* head = NULL; add(&head, "hello"); add(&head, "world"); serialize(head, "data.bin"); Node* new_head = deserialize("data.bin"); Node* cur = new_head; while (cur != NULL) { printf("%s ", cur->data); cur = cur->next; } printf("\n"); return 0; } ``` 代码中,`add`函数用于向链表中添加节点,`serialize`函数用于将链表序列化到文件中,`deserialize`函数用于从文件中反序列化出链表。 在序列化时,我们使用了`fwrite`函数将字符串数据写入文件中。 在反序列化时,我们使用了`fread`函数从文件读取字符串数据,并调用`add`函数将其添加到链表中。 需要注意的是,在序列化和反序列化时,我们需要使用二进制文件模式(`"wb"`和`"rb"`),以确保在写入和读取数据时,不会将文本中的换行符等字符转换为其他字符,从而导致数据失真。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值