“在抛出 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 的实例后调用终止?”的主要内容,如果未能解决你的问题,请参考以下文章