C语言使用fgets读取打印文本时如何跳过空白行
问题说明
使用的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
相关产品推荐
相关产品推荐

