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

C语言使用fgets读取打印文本时如何跳过空白行

问题说明

使用的dnd.csv文件内容预览:
dnd.csv文件预览
初始代码使用fgets读取csv时,无法跳过表头首行,初始代码如下:

#include <stdio.h>

int main()
{
    FILE *f;
    f = fopen("dnd.csv", "r");
    char *var;
    char varchar[301];
    var = &varchar[0];
    int i = 0;
    int j = 0;
    
    while (1)
    {
        fgets(var, 100, f);
        if (feof(f))
        {
            break;
        }
        i = 0;
        while (*(var + i) != ',')
        {
            if (varchar[0] != '\n')
            {
                printf("%c", *(var + i));
                i = i + 1;
            }
        }
        printf(" is character %d\n", j);
        j = j + 1;
    }
    fclose(f);
    return 0;
}

初始运行错误输出:

is character 0
Will is character 1
Mike is character 2
Dustin is character 3
Lucas is character 4

预期效果为跳过表头首行,实现Will对应编号0、Lucas对应编号3的输出。

修复方案

跳过首行的核心逻辑非常简单:在正式处理数据行之前,先单独调用一次fgets把第一行表头读入缓冲区,不做任何处理直接丢弃即可。
除此之外原代码还存在几个潜在问题,需要一并修复:

  • 缺少文件打开结果校验,若文件不存在、路径错误会触发空指针崩溃
  • 内层查找逗号的循环没有边界判断,遇到没有逗号的异常行会出现内存越界访问
  • 空行判断逻辑位置错误,容易触发死循环
  • while(1)+feof的循环写法容易出现多读空行的问题,直接将fgets返回值作为循环判断条件更稳妥

修复后的完整可运行代码:

#include <stdio.h>

int main()
{
    FILE *f = fopen("dnd.csv", "r");
    if (f == NULL) {
        printf("文件打开失败\n");
        return 1;
    }

    char varchar[301];
    int i = 0;
    int j = 0;

    // 读取并丢弃第一行表头
    fgets(varchar, sizeof(varchar), f);

    // 逐行处理后续数据
    while (fgets(varchar, sizeof(varchar), f))
    {
        i = 0;
        // 遍历到逗号/行尾/换行符时停止,输出姓名字段
        while (varchar[i] != ',' && varchar[i] != '\0' && varchar[i] != '\n')
        {
            printf("%c", varchar[i]);
            i++;
        }
        printf(" is character %d\n", j);
        j++;
    }

    fclose(f);
    return 0;
}

运行后输出完全符合预期:

Will is character 0
Mike is character 1
Dustin is character 2
Lucas is character 3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:16:01