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

如何使用fscanf仅读取所需元素?C语言文件读取问题

问题解决:用fscanf解析带格式的文本文件

你的代码存在三个核心问题:

  1. 格式字符串不匹配目标行结构:当前fscanf的"%d %d %s"只能读取纯数字或无特殊符号的字符串,无法解析[1,2]="english"这种带[]和""的格式行。
  2. 缺少循环读取逻辑:仅执行一次fscanf只能处理一行数据,无法遍历所有课程条目。
  3. 错误处理不完善:文件打开失败后未终止程序,后续执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:15:34