我试图从文件中读取字符串,并使用此字符串初始化对象(从“ 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);
}
答案 0 :(得分:0)
您知道的是stoi()
函数引发了异常。您不知道是为什么,或输入了什么。
请注意,您不是要测试丢失的数据。您不需要在每个getline()
之后测试流的状态。而且您没有测试它读取的字符串的大小。例如,如果文件缺少元素,,,
,会发生什么?
要回答您的确切问题,您需要捕获异常并检查异常对象。不过,这可能无济于事:它可能会告诉您输入,但不能告诉流的状态或取自何处。
我建议的是两个循环:一个用于实例化 Movimentacao 的外部循环,以及一个用于收集输入并准备输入的内部循环。将内部内容包装在try / catch中,当遇到错误时,您将能够重构流的状态-尤其是其位置。答案 1 :(得分:0)
它最终成为while(!eof)函数的问题。修改后,它可以正常运行,谢谢大家的帮助!