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

使用fscanf()读取格式化文本文件输出异常,请求错误排查

问题分析与修正方案

核心错误点及解决方法

1. fscanf读取薪资时参数错误

fscanf(pointer_,"%f", salary); 未传入salary的地址,fscanf需要变量指针来存储读取值,直接传变量值会被当作内存地址使用,导致内存越界,出现乱码或零值。
修正:改为 fscanf(pointer_, "%f", &salary);

2. fscanf与fgets混合使用的换行符问题

用fscanf("%d", &code)读取编号后,输入流中残留换行符,fgets会直接读取该换行符作为姓名内容,导致name为空行,后续age、salary读取完全错位,输出格式混乱。
修正方案:

  • 方案一:读取code后用getchar()吃掉换行符:
    fscanf(pointer_, "%d", &code);
    getchar(); // 读取并丢弃换行符
    fgets(name, 35, pointer_);
    
  • 方案二:若姓名不含空格,统一用fscanf读取:
    fscanf(pointer_, "%s", name);
    
    若姓名含空格,优先用方案一,或在文件中用双引号包裹姓名,再通过fscanf("%[^\"]", name)读取(需额外处理引号)。

3. 文件打开失败后未终止程序

fopen返回NULL时,程序仅打印错误信息却继续执行后续代码,会对空指针进行操作,触发未定义行为。
修正:打印错误后调用exit(1)终止程序:

if ((pointer_ = fopen("Formated.txt", "r")) == NULL)
{
    printf("File cannot be opened or is corrupted.\n");
    exit(1);
}

4. main函数返回值不符合标准

标准C中main函数应返回int类型,void main是非标准写法,部分编译器会报错或出现异常。
修正:改为int main(void),并在末尾添加return 0;。

5. 无用的头文件

#include <conio.h> 是非标准头文件,且代码未使用相关函数,建议移除以提升兼容性。

修正后的完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    int code;
    char name[35];
    int age;
    float salary;

    FILE *pointer_;

    if ((pointer_ = fopen("Formated.txt", "r")) == NULL)
    {
        printf("File cannot be opened or is corrupted.\n");
        exit(1);
    }

    while (fscanf(pointer_, "%d", &code) != EOF)
    {
        getchar(); // 吃掉code后的换行符
        fgets(name, 35, pointer_);
        // 移除fgets读取的末尾换行符,避免输出时多空行
        name[strcspn(name, "\n")] = '\0';
        fscanf(pointer_, "%d", &age);
        fscanf(pointer_, "%f", &salary);
        printf("%-5d %-35s %-2d %-7.2f\n", code, name, age, salary);
    }

    fclose(pointer_);
    return 0;
}

额外说明

确保Formated.txt的格式与读取逻辑匹配,示例格式如下:

1001
张三
25
5000.00
1002
李四
30
6500.00

若文件为一行包含所有字段(如1001 张三 25 5000.00),则应统一用fscanf读取,避免混合使用fgets。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:05:33