如何从文本文件读取行内容并拆分存储到自定义结构体变量中?
读取文本文件内容并映射到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
相关产品推荐
相关产品推荐

