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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:10:44