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

C语言读取txt文件时如何跳过行首T字符提取数值

问题说明

需要读取格式如下的txt文件,跳过每行开头的固定字符T,提取后续的三个数字存入对应变量,此前尝试用fscanf的%*c格式符跳过字符未生效。

输入文件内容:

T1, 3, 0
T2, 3, 1
T3, 2, 2

原有实现代码:

int initialize()
{
    int n, n1, n2, n3, i = 0;
    FILE *fp;
    fp = fopen("input.txt", "r");
    if (fp == NULL)
    {
        printf("Error locating the file. Please try again!\n");
        exit(1);
    }
    while (fscanf(fp, "%d, %d, %d", &n1, &n2, &n3) != EOF)
    {

        p[i] = n1;

        if (p[i] > MAX)
        {
            printf("Woah! I am not a super computer. Please input upto 100 processes :)\n");
            exit(1);
        }

        b[i] = n2;

        a[i] = n3;
        i++;
    }
    fclose(fp);
    return i;
}
故障原因

原fscanf使用的格式串"%d, %d, %d"会从当前文件指针位置尝试匹配十进制整数,但每行第一个有效字符是字母T,不属于合法整数起始字符,匹配直接失败,循环无法正常读取数据。单独使用%*c未生效通常是没有处理行与行之间的换行空白符,或者格式串匹配顺序错误导致。

修复方法

直接在格式串最前端加入对固定前缀T的匹配,同时优化循环判断逻辑即可:

  • 格式串开头加一个空格,自动跳过所有前置空白符(换行、空格、制表符),兼容不同换行格式的输入文件
  • 空格后直接写字符T,匹配每行开头的固定前缀,匹配成功后自动跳过该字符,再读取后续整数
  • 将循环判断条件从!= EOF改为== 3,只有成功读取到3个整数时才进入处理逻辑,避免匹配失败时脏数据写入数组

修复后的完整代码:

int initialize()
{
    int n1, n2, n3, i = 0;
    FILE *fp;
    fp = fopen("input.txt", "r");
    if (fp == NULL)
    {
        printf("Error locating the file. Please try again!\n");
        exit(1);
    }
    while (fscanf(fp, " T%d, %d, %d", &n1, &n2, &n3) == 3)
    {
        p[i] = n1;
        if (p[i] > MAX)
        {
            printf("Woah! I am not a super computer. Please input upto 100 processes :)\n");
            exit(1);
        }
        b[i] = n2;
        a[i] = n3;
        i++;
    }
    fclose(fp);
    return i;
}

注:原代码中声明的变量n未被使用,已移除,避免产生无意义的编译警告。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 02:36:50