You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言编程中如何按指定格式将文本文件内容加载到linked list

按格式加载数据到链表的实现步骤

实现前记得引入基础头文件:stdio.h、stdlib.h、string.h

1. 预先定义匹配业务的结构体

先把文本里所有需要存储的字段封装成C语言结构体,作为链表节点的存储载体。针对单链表基础学习阶段,不需要做复杂的嵌套结构,每个节点对应一位客人条目,直接携带所属房间的关联信息即可:

// 链表节点结构
typedef struct GuestNode {
    int room_id;          // 关联的所属房间号
    int bed_count;        // 所属房间的床位数
    char price[20];       // 所属房间的价格(支持带逗号的格式如"12,5")
    char guest_name[100]; // 客人姓名
    char guest_addr[200]; // 客人地址
    struct GuestNode *next; // 链表指针域
} GuestNode;
  • 这种结构完全匹配“床位数决定链表需加载的客人条目数量”的规则,逻辑简单没有额外嵌套,适配初学阶段的认知水平。
  • 价格直接用字符串存储,避免处理本地化数值格式带来的额外复杂度。

2. 封装行读取的通用工具函数

文本中的姓名、地址、分隔符都包含空格或特殊字符,不能用scanf("%s")直接读取,必须按整行读入。这里需要处理一个最容易踩的坑:fgets()读入整行时,会把行末尾的换行符\n一起存入缓冲区,如果不处理,后续判断分隔符、比较字符串时会永远匹配失败。
对应的工具函数实现:

// 从文件流读取一行,自动去掉末尾的换行符
void read_line(FILE *fp, char *buf, int max_len) {
    if (fgets(buf, max_len, fp) == NULL) {
        buf[0] = '\0';
        return;
    }
    int len = strlen(buf);
    // 替换末尾的换行为字符串结束符
    if (len > 0 && buf[len - 1] == '\n') {
        buf[len - 1] = '\0';
    }
}

3. 按固定顺序解析文件内容

给定的文本格式是严格按顺序排布的,不需要动态判断格式分支,按固定步骤逐行读取即可,整体流程:

  • 循环读取直到文件结束:
    1. 读第一行转成整数,作为当前处理房间的房间号
    2. 读第二行转成整数,作为当前房间的床位数(这个数字就是接下来要为这个房间创建的链表节点数量)
    3. 读第三行,直接存为当前房间的价格字符串
    4. 读下一行,判断内容为#,这是客人块的起始分隔符,直接跳过不做存储
    5. 执行和床位数次数相等的客人读取循环:
      • 读一行存为客人姓名
      • 读一行存为客人地址
      • 读下一行,根据内容判断是同房间下一位客人的分隔符#,还是当前房间块的结束分隔符---,直接跳过不做存储
    6. 每读完一位客人的完整信息,就申请一块和GuestNode大小一致的内存,把之前存的房间号、床位数、价格、客人姓名、客人地址填充到节点里,用尾插法把节点挂到链表尾部。

4. 初学阶段的避坑提示

  • 不要混用scanf("%d")和fgets():用scanf读整数后,输入缓冲区会残留换行符,后续fgets会直接读到空行,导致整个解析流程错位。所有字段统一用read_line()读成字符串,需要整数的字段再通过atoi()转换即可。
  • 实现尾插逻辑时维护一个固定的链表尾指针,不要每次插入都从头遍历找尾部,写起来更简单也更不容易出错。
  • 读取客人数量时,必须以之前读到的床位数作为循环次数的硬依据,不要靠数#或---的数量判断读了多少客人,严格匹配给定的格式规则。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 09:06:04