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

使用C语言fgetc函数时如何跳过换行符'\n'?

问题

我始终无法理解,为何代码中跳过'\n'换行符的逻辑不起作用——按逻辑,当读取到'\n'时应该读取下一个字符才对?

我的代码如下:

FILE *fp = fopen(filename, "r");
if (fp != NULL) {
    char c;
    
    for (int i = 0; i < NUMBER_OF_VERTICES; i++) {
        for (int j = 0; j < NUMBER_OF_VERTICES; j++) {
            c = fgetc(fp);
            if (c == ' ' || c == '\r' || c == '\n') c = fgetc(fp);
            printf("%c", c);
            pMatrix->matrix[i][j] = ((int)c) - 48;
        }
    }
    
    fclose(fp);
}

待读取的文件内容:

0 7 0 2 0 0 0 0 0 0
7 0 4 8 0 0 0 0 0 0
0 4 0 1 0 0 0 0 0 0
2 8 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

我的需求是将文件中的数值存入矩阵,通过嵌套循环遍历矩阵的行列。目前数值输入等操作都正常,但每行末尾的换行符'\n'无法被跳过。此前我通过忽略'\r'解决过类似问题,推测本次也是同类问题,但找不到原因,恳请帮助。

解决方案

你的问题出在只跳过了一次空白字符。比如当遇到\n后,你调用了一次fgetc,但如果这次读取到的还是空白字符(比如部分系统换行是\r\n组合,或者文件存在连续空白),就会直接把这个空白字符存入矩阵,导致逻辑失效。

正确的做法是用循环持续跳过所有连续的空白字符,直到读到非空白的有效字符:

修改后的代码:

FILE *fp = fopen(filename, "r");
if (fp != NULL) {
    char c;
    
    for (int i = 0; i < NUMBER_OF_VERTICES; i++) {
        for (int j = 0; j < NUMBER_OF_VERTICES; j++) {
            // 循环跳过所有空白字符,同时检查文件结束
            do {
                c = fgetc(fp);
                if (c == EOF) {
                    // 遇到文件提前结束,做简单处理后退出
                    fclose(fp);
                    return;
                }
            } while (c == ' ' || c == '\r' || c == '\n');
            
            printf("%c", c);
            // 用'0'代替48,可读性更强
            pMatrix->matrix[i][j] = c - '0';
        }
    }
    
    fclose(fp);
}

额外补充两个优化点:

  • 替换魔法数字48为字符'0',代码语义更清晰,避免硬编码的维护问题;
  • 每次读取字符后检查EOF,防止文件内容不足时出现死循环或读取垃圾值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 06:35:25