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

如何从文本文件读取行内容并拆分存储到自定义结构体变量中?

读取文本文件内容并映射到C结构体的实现方案

首先得提个小细节:C标准库中并没有原生的string类型,所以你定义的INFOR结构体里的string studentid需要改成字符数组(比如char studentid[20];),这样才能在C环境里正常编译使用。

接下来我们先梳理文本每行字段和结构体成员的对应关系:

  • 第1个字段 → INFOR.studentid
  • 第3个字段 → INFOR.program(跳过第2个固定的"Class"字段)
  • 第4个字段 → INFOR.state
  • 第5个字段 → INFOR.a.current
  • 第6个字段 → INFOR.a.subject
  • 第7-8个字段 → INFOR.name(注意名字带空格,需要特殊处理)
  • 第9个字段 → INFOR.contact

下面是具体的实现步骤和代码:

1. 修正后的结构体定义

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

// 定义CGPA结构体
typedef struct {
    double current;
    unsigned int subject;
} CGPA;

// 修正后的INFOR结构体,替换string为字符数组
typedef struct {
    char program[40];
    char state[50];
    char name[50];
    char contact[50];
    char studentid[20];
    CGPA a;
} INFOR;

2. 读取并解析文件的核心逻辑

我们用fopen打开文件,逐行用fgets读取内容,再通过sscanf拆分字段到结构体变量中。针对带空格的名字,用%[^\t\n]格式符来读取:

int main() {
    FILE *file = fopen("your_file.txt", "r");
    if (!file) {
        perror("Failed to open file");
        return EXIT_FAILURE;
    }

    INFOR student;
    char line[256];  // 足够容纳单条记录的内容

    // 逐行读取并解析
    while (fgets(line, sizeof(line), file)) {
        // 解析每行,%*s用来跳过固定的"Class"字段
        int parse_result = sscanf(line, "%s %*s %s %s %lf %u %[^\t\n] %s",
                           student.studentid,
                           student.program,
                           student.state,
                           &student.a.current,
                           &student.a.subject,
                           student.name,
                           student.contact);

        // 验证解析是否成功
        if (parse_result != 7) {
            printf("Warning: Failed to parse line: %s", line);
            continue;
        }

        // 这里可以添加后续处理逻辑,比如打印验证
        printf("Student ID: %s\n", student.studentid);
        printf("Program: %s\n", student.program);
        printf("State: %s\n", student.state);
        printf("CGPA: %.1f\n", student.a.current);
        printf("Subject Count: %u\n", student.a.subject);
        printf("Name: %s\n", student.name);
        printf("Contact: %s\n\n", student.contact);
    }

    fclose(file);
    return EXIT_SUCCESS;
}

关键代码说明

  • %*s:表示读取但不存储该字段,用来跳过每行固定的"Class"字符串
  • %[^\t\n]:匹配所有非换行、非制表符的字符,完美适配带空格的姓名字段
  • 用sscanf的返回值判断是否成功解析7个字段,避免错误数据干扰后续流程
  • 操作完成后记得调用fclose关闭文件,避免资源泄漏

如果你的文本文件格式完全固定,这个方案可以稳定地把内容拆分到对应结构体变量中,方便后续的业务处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:32:36