You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C++读取文本文件浮点数据计算结果不符预期求助

问题排查与解决方案

嘿,我来帮你找出代码里的问题,主要有两个关键错误导致结果不符合预期:

1. 变量名拼写错误

你在计算total的时候写的是:

total = dat_1 * data_2;

但你定义的变量是data_1(注意多了一个字母a)!这个拼写错误要么会导致编译器报错,要么如果编译器允许未声明变量(某些旧环境),dat_1会是一个随机值,直接让计算结果完全错误。

2. 文本内容的格式未处理

你的文本文件每行开头都带有序号(比如1. 20.20),直接用std::getline读取整行后调用std::stof,它会从第一个字符开始解析数字,遇到非数字字符(这里是序号后的空格)就停止解析。所以:

  • 第一行1. 20.20会被解析成1.0
  • 第二行2. 3会被解析成2.0
    相乘后得到2.0,自然和预期的60.60不符。

修正后的代码

这里提供两种可行的修正方案:

方案一:通过字符串截取提取数字

#include <iostream>
#include <fstream>
#include <string>

int main() { 
    std::string tp; 
    float data_1 = 0, data_2 = 0, total = 0; 
    std::fstream file; 
    file.open("text.txt", std::ios::in); 

    // 处理第一行,提取序号后的数字
    std::getline(file, tp);
    size_t dot_pos = tp.find('.');
    if (dot_pos != std::string::npos) {
        data_1 = std::stof(tp.substr(dot_pos + 1));
    }

    // 处理第二行
    std::getline(file, tp);
    dot_pos = tp.find('.');
    if (dot_pos != std::string::npos) {
        data_2 = std::stof(tp.substr(dot_pos + 1));
    }

    total = data_1 * data_2; // 修正变量名拼写
    std::cout << "Total: " << total << std::endl; 

    file.close();
    return 0;
}

方案二:使用字符串流解析(更健壮)

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>

int main() { 
    std::string tp; 
    float data_1 = 0, data_2 = 0, total = 0; 
    std::fstream file; 
    file.open("text.txt", std::ios::in); 

    // 解析第一行:读取序号、分隔点,再读取数字
    std::getline(file, tp);
    std::istringstream iss1(tp);
    int dummy_idx;
    char dummy_dot;
    iss1 >> dummy_idx >> dummy_dot >> data_1;

    // 解析第二行
    std::getline(file, tp);
    std::istringstream iss2(tp);
    iss2 >> dummy_idx >> dummy_dot >> data_2;

    total = data_1 * data_2; // 修正变量名拼写
    std::cout << "Total: " << total << std::endl; 

    file.close();
    return 0;
}

这两种方案都能正确提取出20.203,相乘后得到预期的60.60


内容的提问来源于stack exchange,提问作者dinarko

火山引擎 最新活动