C语言读取文件返回double数组遇‘数组类型赋值’错误求助
代码中的问题及修正方案
核心错误及原因
函数返回值类型不匹配
你声明fileopener返回double类型,但实际返回的是数组new_double——在C中数组会隐式转换为指向首元素的指针(类型为double*),和声明的返回类型完全不兼容,需要将函数返回类型改为double*。数组无法直接赋值
C语言中数组变量是不可修改的左值,不能用=直接赋值,main里的t = fileopener(filename);是非法操作,这就是你看到error: assignment to expression with array type的直接原因。若要复制数据,需用循环逐个赋值或memcpy函数。
其他设计与逻辑缺陷
全局数组的可重入性问题
依赖全局数组new_double存储数据,会导致函数不具备可重入性——多次调用会覆盖之前的数据,且无法灵活适配不同的数组大小需求。更合理的做法是让调用者传入目标数组,或在函数内部动态分配内存。feof循环逻辑错误while (!feof(file) && !ferror(file))的写法存在问题:feof仅在尝试读取超出文件末尾后才会置位,可能导致最后一行被重复读取。应直接用fgets的返回值控制循环,同时限制读取行数不超过MAX_LINES,避免数组越界。空指针未处理
当fopen失败返回NULL时,你仅打印错误信息但继续执行后续操作,会触发空指针访问的未定义行为。需在fopen失败后直接返回(比如返回NULL)。
修正方案示例(调用者传入数组)
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_LINES 300 #define MAX_LEN 100 // 返回实际读取的行数,调用者传入目标数组和最大可读取行数 int fileopener(char *fileinput, double *output, int max_lines) { if (output == NULL || max_lines <= 0) { return -1; } FILE *file = fopen(fileinput, "r"); if (file == NULL) { printf("Error opening file yo\n"); return -1; } char data[MAX_LEN]; int line = 0; // 用fgets返回值控制循环,同时限制行数避免越界 while (line < max_lines && fgets(data, MAX_LEN, file) != NULL) { output[line] = strtod(data, NULL); printf("The double value read is: %f\n", output[line]); line++; } fclose(file); printf("Done\n\n"); return line; } int main(){ double t[MAX_LINES]; char *filename = "AbsTime_v.txt"; int count = fileopener(filename, t, MAX_LINES); if (count == -1) { return 1; } // 遍历读取到的数据 for (int i = 0; i < count; i++) { printf("t[%d] = %f\n", i, t[i]); } return 0; }
修正方案示例(动态分配内存)
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_LINES 300 #define MAX_LEN 100 // 返回动态分配的数组,通过output_count返回读取的行数 double* fileopener(char *fileinput, int *output_count) { if (output_count == NULL) { return NULL; } *output_count = 0; FILE *file = fopen(fileinput, "r"); if (file == NULL) { printf("Error opening file yo\n"); return NULL; } double *new_double = malloc(sizeof(double) * MAX_LINES); if (new_double == NULL) { printf("Memory allocation failed\n"); fclose(file); return NULL; } char data[MAX_LEN]; int line = 0; while (line < MAX_LINES && fgets(data, MAX_LEN, file) != NULL) { new_double[line] = strtod(data, NULL); printf("The double value read is: %f\n", new_double[line]); line++; } fclose(file); *output_count = line; printf("Done\n\n"); return new_double; } int main(){ char *filename = "AbsTime_v.txt"; int count; double *t = fileopener(filename, &count); if (t == NULL) { return 1; } // 使用数据 for (int i = 0; i < count; i++) { printf("t[%d] = %f\n", i, t[i]); } // 释放动态分配的内存 free(t); return 0; }
内容的提问来源于stack exchange,提问作者kartiks77
相关产品推荐
相关产品推荐

