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未正确输出换行(或系统行缓冲机制未及时刷新),三次循环的输出会被缓冲,直到程序结束才一次性打印,可能让你误以为循环只执行了一次。但你明确说明“仅进入一次循环”,此情况可能性较低。
验证与解决建议
- 先检查文件打开是否成功,添加判断逻辑:
FILE *fp = fopen("test","r"); if(fp == NULL) { perror("fopen failed"); return 1; }
- 用纯文本编辑器打开
test文件,确认所有行开头是半角数字、且与后续字符串用空格分隔,无隐藏前缀或特殊字符。 - 改用
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
相关产品推荐
相关产品推荐

