为何无法用C++流读取TXT文件中的双精度数值并转为向量?
问题分析与解决
代码中的核心问题
- 文件打开失败未终止执行:文件打开失败后仅输出提示,但后续代码继续执行,会触发未定义行为。
- 数组越界访问:
myArray[term][0]是非法操作——myArray是大小为term的指针数组,有效索引范围是0到term-1,直接用term会越界,导致内存错误。 - 读取逻辑与文件内容不匹配:你的TXT每行只有3个双精度数值,但代码里每次循环要读取
term*4个数值,远超过文件实际内容,会导致文件流进入错误状态,后续读取全部失败。 - 裸指针内存管理风险:手动
new/delete内存容易泄漏或出错,且不符合你想用vector存储数据的需求。
修正后的代码(改用vector实现)
#include "CurveFitting.h" #include <cmath> #include <fstream> #include <iostream> #include <vector> void CurveFitting::txtCurveFitting() { std::ifstream file(filename); if (!file) { std::cout << "文件读取失败" << std::endl; return; // 打开失败直接终止函数 } // 用vector存储每行的三个双精度数值 std::vector<std::vector<double>> data; double a, b, c; // 按行读取三个数值,直到文件结束 while (file >> a >> b >> c) { data.push_back({a, b, c}); } // 如果没有读到数据,直接返回 if (data.empty()) { std::cout << "未读取到有效数据" << std::endl; file.close(); return; } // 用vector替代裸指针存储计算后的数据 std::vector<float> datax, datay, dataz; const double pi = acos(-1.0); // 定义pi的值,或确保类中有该成员 for (const auto& row : data) { double time = row[0]; double frequency = row[1]; double output = row[2]; // 原代码用了myArray[term][3],但文件仅3个值,此处取第三个 saveCurveFitting(); float cos_val = static_cast<float>(cos(2 * pi * frequency * time)); float sin_val = static_cast<float>(sin(2 * pi * frequency * time)); datax.push_back(cos_val); datay.push_back(sin_val); dataz.push_back(static_cast<float>(output)); } file.close(); // 后续可直接使用data、datax、datay、dataz这些vector }
关键改进点
- 用
std::vector替代裸指针,自动管理内存,避免泄漏和越界风险。 - 读取逻辑匹配文件内容:每行读取3个数值,直到文件结束,无需提前知道行数
numOfData。 - 文件打开失败后立即终止函数,避免后续非法操作。
- 移除了原代码中多余的二维数组
myArray,简化逻辑,直接将读取的数据存入vector。
内容的提问来源于stack exchange,提问作者mi0
相关产品推荐
相关产品推荐

