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

C语言读取表格文件到double数组出错:输出乱码且栈溢出求助

问题原因及解决办法

核心错误根源:栈溢出(Stack Smashing)

这个错误100%是数组越界写入导致的——你定义的T、rho、P数组大小固定,但实际文件行数远超数组长度,写入时超出栈内存边界,触发系统的栈溢出保护机制。

其他导致乱码/0值的常见问题

  • 文件未正确打开:没有检查fopen的返回值,比如文件路径写错、文件不存在,后续读取操作都是对空指针执行,导致变量值为垃圾值或0。
  • 读取格式不匹配:double类型读取必须用%lf格式符(printf可以用%f但fscanf必须用%lf),如果用错格式符(比如%d),会导致读取失败,变量未被正确赋值。
  • 数组大小不足:如果直接在栈上定义大数组(比如double T[1000];),当文件行数超过这个值时,不仅会栈溢出,还会出现乱码。

修复方案

步骤1:先统计文件行数,动态分配内存

避免栈上数组大小不够的问题,用堆内存存储数据:

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

int main() {
    FILE* fp = fopen("QEOS.txt", "r");
    if (fp == NULL) {
        perror("文件打开失败");
        return 1;
    }

    // 统计文件行数
    int line_count = 0;
    char buf[256];
    while (fgets(buf, sizeof(buf), fp) != NULL) {
        line_count++;
    }
    fseek(fp, 0, SEEK_SET); // 回到文件开头

    // 动态分配数组内存
    double* T = (double*)malloc(line_count * sizeof(double));
    double* rho = (double*)malloc(line_count * sizeof(double));
    double* P = (double*)malloc(line_count * sizeof(double));
    if (T == NULL || rho == NULL || P == NULL) {
        perror("内存分配失败");
        fclose(fp);
        return 1;
    }

    // 读取三列数据
    for (int i = 0; i < line_count; i++) {
        if (fscanf(fp, "%lf %lf %lf", &T[i], &rho[i], &P[i]) != 3) {
            printf("第%d行读取失败\n", i+1);
            break;
        }
    }

    // 测试输出(示例)
    for (int i = 0; i < 5 && i < line_count; i++) {
        printf("T=%.3lf, rho=%.3lf, P=%.3lf\n", T[i], rho[i], P[i]);
    }

    // 释放资源
    free(T);
    free(rho);
    free(P);
    fclose(fp);
    return 0;
}

关键注意点

  • 必须检查fopen和malloc的返回值,避免空指针操作。
  • 读取double类型一定要用%lf格式符。
  • 大数组不要放在栈上,用malloc/new分配堆内存,用完记得释放。

内容的提问来源于stack exchange,提问作者Michael L.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:20:30