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

fscanf读取异常:仅读取最后一行且循环仅执行一次的原因排查

问题分析:fscanf循环仅执行一次的原因

代码与文件内容

你的C语言代码:

fp = fopen("test","r");
int i;
while (fscanf(fp,"%d %*s %*s",&i) > 0)
{
   printf("%d\n",i);
}

对应的文本文件test内容:

4 jane good
0 may day
5 july hello

核心原因及可能性

  • 文本文件存在无法被%d识别的前缀内容:
    如果文件开头有隐藏字符(如UTF-8的BOM头EF BB BF),或前两行的数字是全角字符、带有非数字前缀,fscanf的%d格式会匹配失败,返回0,循环条件>0不满足,不会进入循环。直到读取到最后一行的半角数字时,fscanf匹配成功返回1,循环仅执行一次。

  • 文件打开失败未做检查:
    如果fopen未成功打开文件(如文件路径错误、权限不足),fp会是NULL,此时fscanf的行为未定义,可能偶然读取到内存中的某个值(恰好等于最后一行的数字),导致看起来只执行了一次循环。

  • 输出缓冲导致的视觉误解(概率较低):
    若printf未正确输出换行(或系统行缓冲机制未及时刷新),三次循环的输出会被缓冲,直到程序结束才一次性打印,可能让你误以为循环只执行了一次。但你明确说明“仅进入一次循环”,此情况可能性较低。

验证与解决建议

  1. 先检查文件打开是否成功,添加判断逻辑:
FILE *fp = fopen("test","r");
if(fp == NULL) {
    perror("fopen failed");
    return 1;
}
  1. 用纯文本编辑器打开test文件,确认所有行开头是半角数字、且与后续字符串用空格分隔,无隐藏前缀或特殊字符。
  2. 改用fgets逐行读取后解析,避免fscanf跨换行读取的潜在问题:
char buf[100];
while(fgets(buf, sizeof(buf), fp)) {
    if(sscanf(buf, "%d %*s %*s", &i) == 1) {
        printf("%d\n", i);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:25:00