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

C语言如何直接读取含无关文本的txt文件并跳过无效行提取数值

结论

完全可以直接读取orig_data.txt,不需要提前手动剔除无用文本,只需要在读取逻辑中增加跳过指定无用行的步骤即可,下面是两种可直接使用的实现方案:


方案1:用fgets跳过整行(兼容性最好)

这种方案不依赖无用行的文本内容,只要文件格式固定、无用行的位置固定即可正常运行,修改后的代码如下:

void readdata() {
    FILE* fp = fopen("orig_data.txt", "r");
    if (fp == NULL) {
        // 可自行补充文件打开失败的处理逻辑
        return;
    }
    char buf[1024];
    // 跳过第一行无用文本
    fgets(buf, sizeof(buf), fp);
    // 读取第二行的客户总数
    int no_cust;
    fscanf(fp, "%d", &no_cust);
    // 连续调用两次fgets:第一次吃掉读取no_cust后残留的换行符,第二次跳过第三行表头
    fgets(buf, sizeof(buf), fp);
    fgets(buf, sizeof(buf), fp);
    
    int* ids  = new int[no_cust+1];
    int* ssns = new int[no_cust+1];
    for(int i = 1; i <= no_cust; i++) {
        fscanf(fp, "%d %d", &ids[i], &ssns[i]);
    }
    // 其他业务逻辑
    // 注意:数组使用完毕后需要执行 delete[] ids; delete[] ssns; 释放内存
    fclose(fp);
}

方案2:用fscanf忽略匹配内容(代码更简洁)

利用fscanf格式符中的*修饰符,可以匹配对应内容但不存储到变量,实现直接跳过无用内容的效果,代码如下:

void readdata() {
    FILE* fp = fopen("orig_data.txt", "r");
    if (fp == NULL) {
        return;
    }
    int no_cust;
    // %*[^\n] 匹配第一行所有非换行字符且不存储,之后直接读取第二行的客户总数
    fscanf(fp, "%*[^\n]%d", &no_cust);
    // 跳过第三行整行表头内容
    fscanf(fp, "%*[^\n]");
    
    int* ids  = new int[no_cust+1];
    int* ssns = new int[no_cust+1];
    for(int i = 1; i <= no_cust; i++) {
        fscanf(fp, "%d %d", &ids[i], &ssns[i]);
    }
    // 其他业务逻辑
    fclose(fp);
}

注意事项

  • 以上两种方案都依赖「文件格式统一,仅客户总数值不同」的前提,只要无用行的位置不发生变化就可以稳定运行
  • 实际使用时建议增加fscanf读取失败的判断逻辑,应对文件损坏的异常场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 23:54:03