C语言编写文件读取双精度浮点数程序遇多个编译错误求解
问题修复方案
报错根因与解决
1. C1090 报错
这是Visual Studio生成调试符号(PDB)时的冲突错误,解决方案:
- 关闭OneDrive、Mega等云同步工具对项目所在目录的同步
- 或将项目迁移到未开启云同步的本地文件夹即可
2. C4024 与 间接寻址层级不匹配报错
两个报错属于同一类问题,根源是read_double函数的第二个参数是size_t*指针类型(作为输出参数返回读取到的元素个数),你在调用时直接传入了常量3,类型不匹配。
代码逻辑其他问题修复
你的现有代码还存在多处逻辑错误,需要一并修正:
fopen第二个参数错误:只读模式打开文件应该传字符串"r",你误传了指针参数size,会直接导致文件打开失败- 内存分配逻辑错误:每次循环都重新调用
malloc,之前分配的内存会泄漏、且之前读取的数值会全部丢失,应该用realloc动态扩容 fscanf写入地址错误:每次都向data首地址写入数值,会覆盖之前的读取结果,应该写入当前数组下标对应的地址- 循环条件逻辑错误:
size是指针,直接用value != (size+1)比较的是数值和内存地址,完全不符合预期,应该判断fscanf返回值是否为1(成功读取1个double)来控制循环 - 输出参数赋值错误:要给
size指向的内存赋值,应该解引用写*size = 读取个数,直接修改size指针本身的地址无意义
修复后完整代码
read.h
#if !defined READ_H #define READ_H #define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <stdio.h> extern double* read_double(const char* filename, size_t* size); #endif /* READ_H */
read.c
#include "read.h" double* read_double(const char* filename, size_t* size) { // 只读模式打开文件 FILE* f = fopen(filename, "r"); /* 空指针校验 */ if (f == NULL) { *size = 0; return NULL; } double* data = NULL; size_t count = 0; double temp; int read_ret; // 循环读取 while ((read_ret = fscanf(f, "%lf", &temp)) == 1) { // 动态扩容 double* new_data = realloc(data, (count + 1) * sizeof(double)); if (new_data == NULL) { // 扩容失败,释放已分配内存 free(data); fclose(f); *size = 0; return NULL; } data = new_data; data[count++] = temp; } // 读取异常判断:如果返回值不是EOF说明遇到了非数字内容 if (read_ret != EOF) { free(data); fclose(f); *size = 0; return NULL; } // 赋值输出参数 *size = count; fclose(f); return data; } int main(void) { size_t read_count = 0; double* data = read_double("this is a general routine test.txt", &read_count); // 后续可根据read_count遍历data,使用完需要调用free(data)释放内存 free(data); return 0; }
内容的提问来源于stack exchange,提问作者Gabriel Burzacchini
相关产品推荐
相关产品推荐

