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

如何使用fgets检测换行符并忽略后继续执行while循环?

如何在C语言读取文件时忽略空行?

问题描述

我写了一段读取文件并输出内容的C代码:

#include <stdio.h>
#include <string.h>
int main(int argc, char **argv) {
    FILE *file = fopen(argv[1], "r");
    char buf[100];
    char *pos;
    while (fgets(buf, sizeof(buf), file)) {
        if ((pos=strchr(buf, '\n')) != NULL) *pos = '\0';
        printf("%s\n", buf);
    }
}

现在有个文件内容是这样的:

a
b

c

我希望程序运行时能忽略里面的空行,输出结果如下:

$ gcc -Wall above.c
$ ./a.out file
a
b
c

请问该怎么修改代码实现这个需求?


解决方案

很简单,我们只需要在处理每行内容时,判断它是否为空行,是空行就跳过输出即可。这里的空行指的是去掉换行符后没有任何有效内容的行。

我给你修改后的代码,还顺便加了一些鲁棒性检查(避免参数错误或文件打开失败导致崩溃):

#include <stdio.h>
#include <string.h>
int main(int argc, char **argv) {
    // 检查是否传入了文件名参数
    if (argc < 2) {
        fprintf(stderr, "用法: %s <文件名>\n", argv[0]);
        return 1;
    }
    
    FILE *file = fopen(argv[1], "r");
    // 检查文件是否成功打开
    if (!file) {
        perror("无法打开文件");
        return 1;
    }
    
    char buf[100];
    char *pos;
    while (fgets(buf, sizeof(buf), file)) {
        // 去除换行符(如果存在)
        if ((pos = strchr(buf, '\n')) != NULL) {
            *pos = '\0';
        }
        
        // 判断是否是空行:长度为0说明没有有效内容
        if (strlen(buf) == 0) {
            continue; // 跳过当前空行,继续下一次循环
        }
        
        printf("%s\n", buf);
    }
    
    // 记得关闭文件,释放资源
    fclose(file);
    return 0;
}

关键修改点:

  • 新增了参数校验:确保用户传入了文件名,避免argv[1]为空导致的未定义行为
  • 新增了文件打开校验:如果文件不存在或无法读取,会给出明确错误提示
  • 核心逻辑:在去除换行符后,用strlen(buf)判断行长度,若为0则用continue跳过输出,直接进入下一次循环读取下一行

这样修改后,编译运行程序,就能自动忽略文件中的空行,得到你想要的输出结果了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:33:13