如何使用fscanf仅读取所需元素?C语言文件读取问题
问题解决:用fscanf解析带格式的文本文件
你的代码存在三个核心问题:
- 格式字符串不匹配目标行结构:当前
fscanf的"%d %d %s"只能读取纯数字或无特殊符号的字符串,无法解析[1,2]="english"这种带[]和""的格式行。 - 缺少循环读取逻辑:仅执行一次
fscanf只能处理一行数据,无法遍历所有课程条目。 - 错误处理不完善:文件打开失败后未终止程序,后续执行
fscanf会触发未定义行为。
修正后的代码
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(){ FILE *inputFile; int total_days, total_sessions; // 存储第一行的7和6 int day; int session; char subject[15]; inputFile = fopen("Schedule.txt", "r"); if (inputFile == NULL) { puts("File Schedule.txt Open Error."); return 1; // 打开失败直接退出程序 } // 先读取第一行的两个数字 fscanf(inputFile, "%d %d", &total_days, &total_sessions); printf("总天数:%d,总时段:%d\n", total_days, total_sessions); // 循环读取所有课程条目 // 格式字符串匹配 [day,session]="subject" 的结构 while (fscanf(inputFile, " [%d,%d]=\"%[^\"]\"", &day, &session, subject) != EOF) { printf("Day: %d, Session: %d, Subject: %s\n", day, session, subject); } fclose(inputFile); return 0; }
关键格式字符串说明
" [%d,%d]=\"%[^\"]\"" 的作用:
- 开头的空格:跳过行首可能存在的空白字符(包括换行符)
[%d,%d]:匹配[,读取第一个整数到day,匹配逗号,读取第二个整数到session,匹配]=\":匹配="字符%[^\"]:读取所有不是双引号的字符到subject,精准提取引号内的课程名称
输出结果示例
总天数:7,总时段:6 Day: 1, Session: 2, Subject: english Day: 1, Session: 4, Subject: linear Day: 2, Session: 4, Subject: calculus Day: 3, Session: 1, Subject: pe Day: 3, Session: 3, Subject: Programming
内容的提问来源于stack exchange,提问作者Theodore Maximus
相关产品推荐
相关产品推荐

