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.20和3,相乘后得到预期的60.60。
内容的提问来源于stack exchange,提问作者dinarko




