fscanf读取数字错误,无法读取首行以外内容且陷入死循环
问题排查与解决
核心错误分析
1. feof 误用引发死循环
while(!feof(f)) 是典型的错误写法:feof 仅在尝试读取并越过文件末尾时才会返回真。如果某次fscanf读取失败(比如格式不匹配、文件读取异常),文件指针不会移动,feof始终为假,程序就会陷入死循环,重复输出之前读取的内容。
2. printf 输出地址而非实际数值
你的printf中使用&numbers[0],这是取数组元素的内存地址,而非元素本身的数值。输出的一串数字(6421984等)都是内存地址,不是文件里存储的数字。
3. fscanf 格式串冗余换行干扰读取
格式串末尾的\n完全多余:fscanf的%s和%d会自动跳过任意空白字符(包括换行、空格、制表符),额外的\n会让fscanf持续等待空白输入,可能导致读取流程异常。
修正后的代码
#include <stdio.h> int main() { FILE *f = fopen("your_file.txt", "r"); if (!f) { perror("Failed to open file"); return 1; } char first[50], last[50]; int numbers[5]; // 用fscanf返回值判断是否成功读取全部7个字段 while (fscanf(f, "%s %s %d %d %d %d %d", first, last, &numbers[0], &numbers[1], &numbers[2], &numbers[3], &numbers[4]) == 7) { printf("%s %s %d %d %d %d %d\n", first, last, numbers[0], numbers[1], numbers[2], numbers[3], numbers[4]); } fclose(f); return 0; }
关键修改点
- 替换循环判断逻辑:用
fscanf的返回值判断是否成功读取7个字段(2个字符串+5个整数),返回值等于7则继续循环,否则退出(覆盖文件读完或读取失败的场景)。 - 修正
printf参数:去掉numbers元素的取地址符&,直接输出元素实际值。 - 移除冗余格式符:删除
fscanf格式串末尾的\n,避免不必要的输入等待。 - 增加文件校验:添加
fopen的错误判断,防止空指针操作引发崩溃。
内容的提问来源于stack exchange,提问作者Galorch
相关产品推荐
相关产品推荐

