C++使用stringstream读取txt文件复数时虚部始终为0问题求助
问题根源
你遇到的问题核心来自两个错误:
- 变量名不匹配:你定义的符号存储变量是
char sign,但后续所有逻辑里用的都是未声明/未初始化的plusorminus变量,读取操作行为异常,直接导致后续虚部读取失败,im会一直保留你初始化的0值。 - 没有校验流读取的返回状态:一旦某一步读取失败(比如符号读取异常、行内容为空),后续的变量都不会被赋值,始终保持初始值0。
另外你用的while (!fin.eof())是经典错误写法,该标记只有在读取失败后才会置位,会导致最后多循环一次读取空行,也会触发读取失败输出0。
修正方案
- 统一变量名,把
sign改成plusorminus - 校验每轮getline和流读取的状态,只有读取成功才走后续逻辑
- 修正循环写法,直接把getline作为循环判断条件
修正后代码
#include <iostream> #include <fstream> #include <sstream> #include <string> using namespace std; int main() { ifstream fin("你的复数文件路径.txt"); string oneline; double real, im; char plusorminus, ichar; // 统一变量名 // 修正循环写法,读取成功才进入逻辑 while (getline(fin, oneline)) { if (oneline.empty()) continue; // 跳过空行 real = 0; im = 0; plusorminus = '\0'; ichar = '\0'; stringstream ss(oneline); // 校验读取是否全部成功 if (ss >> real >> plusorminus >> im >> ichar) { switch (plusorminus) { case '-': im = -im; break; case 'i': // 匹配纯虚数形如5i的场景 im = real; real = 0; break; case '\0': im = 0; break; } cout << "读取到复数:" << real << (im >=0 ? "+" : "") << im << "i" << endl; } else { // 异常格式提示 cerr << "跳过无效行:" << oneline << endl; } } fin.close(); return 0; }
内容的提问来源于stack exchange,提问作者scarlet_dragon
相关产品推荐
相关产品推荐

