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

C语言读取文件:如何处理列数不一致的多行输入?

处理列数可变的文本行读取问题

针对你遇到的列数不同的文本行读取问题,核心解决思路是先读取每行的第一个功能号(funcNum),再根据功能号的不同,使用对应的格式读取该行剩余内容。

原代码失败原因

你用固定格式的fscanf(Instruction,"%d %d %s %d",...),但文件里的行元素数量不统一:

  • 比如类型2的行(2 Pasta 4)只有3个元素,第二个%d无法匹配,导致tableNum值异常,后续的字符串和数字也读取失败;
  • 类型5的行(5 1)只有2个元素,后面的格式符完全无法匹配,变量值混乱。

可行解决方案代码示例

#include <stdio.h>
#include <string.h>

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

    int first_num;
    // 读取第一行的单个数值
    fscanf(Instruction, "%d", &first_num);
    printf("第一行数值:%d\n", first_num);

    int funcNum, tableNum, amount;
    char name[50];
    int read_count;

    // 循环处理剩余行
    while ((read_count = fscanf(Instruction, "%d", &funcNum)) == 1) {
        switch(funcNum) {
            case 2:
                // 格式:2 字符串 数字
                fscanf(Instruction, "%s %d", name, &amount);
                printf("类型2:%d %s %d\n", funcNum, name, amount);
                break;
            case 3:
            case 4:
                // 格式:3/4 数字 字符串 数字
                fscanf(Instruction, "%d %s %d", &tableNum, name, &amount);
                printf("类型%d:%d %d %s %d\n", funcNum, funcNum, tableNum, name, amount);
                break;
            case 5:
                // 格式:5 数字
                fscanf(Instruction, "%d", &tableNum);
                printf("类型5:%d %d\n", funcNum, tableNum);
                break;
            default:
                // 处理未知类型,跳过该行剩余内容
                char buf[100];
                fgets(buf, sizeof(buf), Instruction);
                printf("未知类型:%d,跳过该行\n", funcNum);
                break;
        }
    }

    fclose(Instruction);
    return 0;
}

关键细节说明

  • 先读取每行的funcNum,通过switch分支匹配对应格式,确保每行的元素数量和格式对应;
  • fscanf会自动跳过换行符和空白字符,处理完一行后不会影响下一行读取;
  • 加入文件打开失败的错误处理,以及未知类型的跳过逻辑,避免程序崩溃;
  • 字符串name需分配足够空间,防止溢出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:02:53