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

