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

使用fscanf读取文件内容到动态数组时得到随机值问题求助

问题原因
  • 缓冲区类型错误:fgets() 要求输入缓冲区为char类型数组,你的代码中定义int line[100],类型不匹配会导致读取到的内容内存解释异常,直接产生乱值。
  • 输入函数混用逻辑错误:fgets() 已经从文件指针veri中读取走了一行内容,后续的fscanf()会继续读取下一行内容,最终会跳过所有奇数行,且读取到文件末尾时fscanf()执行失败,不会给对应数组元素赋值,保留malloc申请内存后的初始随机值。
  • 缺少必要校验:未校验malloc是否分配成功、buffer大小是否大于等于文件总行数(你提供的样例文件共51行,buffer需要至少等于51)、fscanf是否成功读取到4个整数,异常场景下都会产生无效值。
修复代码

你可以选择去掉fgets直接用fscanf循环读取,逻辑更简单:

int* aaNo;
int* bbKod;
int* ccPuan;
int* ddOffset;
// 确认buffer的值>=51,避免数组越界
aaNo = (int*)malloc(buffer * sizeof(int));
bbKod = (int*)malloc(buffer * sizeof(int));
ccPuan = (int*)malloc(buffer * sizeof(int));
ddOffset = (int*)malloc(buffer * sizeof(int));
// 增加内存分配校验
if (!aaNo || !bbKod || !ccPuan || !ddOffset) {
    printf("内存分配失败\n");
    // 这里可以加已分配内存的释放逻辑,再退出
    return -1;
}
int o = 0;
// 直接用fscanf循环读取,返回值等于4说明成功读到4个整数
while (fscanf(veri, "%d %d %d %d", &aaNo[o], &bbKod[o], &ccPuan[o], &ddOffset[o]) == 4) {
    // 增加数组越界校验
    if (++o >= buffer) {
        printf("数组容量不足\n");
        break;
    }
}

如果你需要逐行读取做额外校验,也可以用fgets搭配sscanf的写法:

// 缓冲区改为char类型
char line[100];
int o = 0;
while (fgets(line, sizeof(line), veri) && o < buffer) {
    if (sscanf(line, "%d %d %d %d", &aaNo[o], &bbKod[o], &ccPuan[o], &ddOffset[o]) == 4) {
        o++;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:54:04