“在引发std :: invalid_argument'what():stoi的实例后调用终止。”

时间:2019-10-03 16:43:51

标签: c++ string fstream

我试图从文件中读取字符串,并使用此字符串初始化对象(从“ Movimentacao”类型),并将这些对象放入向量中。为此,我必须将一些字符串转换为int,但是当我尝试执行该程序时,它将显示此错误:

terminate called after throwing an instance of 'std::invalid_argument'
  what():  stoi

代码可以正常编译,并通过一些提示进行调试,我发现该循环执行一次,但是在第二次,该循环使用“ stoi”命令停止。

while(!mov.eof()){
            getline(mov, dia, ',');
            getline(mov, mes, ',');
            getline(mov, ano, ',');
            getline(mov, desc, ',');
            getline(mov, sigla, ',');
            getline(mov, val, ',');
            sig = sigla[0];
            Movimentacao M(stoi(dia), stoi(mes), stoi(ano), desc, sig, stod(val));
            movi.push_back(M);
        }

2 个答案:

答案 0 :(得分:0)

您知道的是stoi()函数引发了异常。您不知道是为什么,或输入了什么。

请注意,您不是要测试丢失的数据。您不需要在每个getline()之后测试流的状态。而且您没有测试它读取的字符串的大小。例如,如果文件缺少元素,,,,会发生什么?

要回答您的确切问题,您需要捕获异常并检查异常对象。不过,这可能无济于事:它可能会告诉您输入,但不能告诉流的状态或取自何处。

我建议的是两个循环:一个用于实例化 Movimentacao 的外部循环,以及一个用于收集输入并准备输入的内部循环。将内部内容包装在try / catch中,当遇到错误时,您将能够重构流的状态-尤其是其位置。

答案 1 :(得分:0)

它最终成为while(!eof)函数的问题。修改后,它可以正常运行,谢谢大家的帮助!