“在抛出 std::invalid_argument' what(): stoi 的实例后调用终止?”

Posted

技术标签:

【中文标题】“在抛出 std::invalid_argument\' what(): stoi 的实例后调用终止?”【英文标题】:"terminate called after throwing an instance of std::invalid_argument' what(): stoi ?"“在抛出 std::invalid_argument' what(): stoi 的实例后调用终止?” 【发布时间】:2019-10-03 16:43:51 【问题描述】:

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

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

代码可以正常编译,并且需要调试一些 couts,我发现循环执行了一次,但在第二次,它在“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);
        

【问题讨论】:

正如错误所说,您对stoi 的输入无效。您需要确保要转换的内容是有效的int 从代码中并不清楚具体是什么问题,但可能与Why is iostream::eof inside a loop condition (i.e. while (!stream.eof())) considered wrong?有关,你应该确保每个getline都成功了。 【参考方案1】:

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

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

要回答您的确切问题,您需要捕获异常并检查异常对象。不过,这可能不会有太大帮助:它可能会告诉您输入,但不会告诉您流的状态或从何处获取。

我建议使用两个循环:一个用于实例化 Movimentacao 的外部循环,一个用于收集输入并准备它们的内部循环。用 try/catch 包裹内层,当遇到错误时,您将能够重建流的状态——尤其是它的位置。

【讨论】:

【参考方案2】:

它最终成为 while(!eof) 函数的问题。修改后开始完美运行,感谢大家的帮助!

【讨论】:

以上是关于“在抛出 std::invalid_argument' what(): stoi 的实例后调用终止?”的主要内容,如果未能解决你的问题,请参考以下文章