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.
相关产品推荐
相关产品推荐

