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

为何无法用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:15:34