如何使用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
相关产品推荐
相关产品推荐

