这是我的代码:
int main()
{
std::ifstream myfile;
myfile.open("ex.txt");
std::string a;
while(myfile.eof()!=1)
{
getline(myfile,a,',');
int i = stoi(a);
if (!(i%2))
std::cout<<a<<std::endl;
}
}
基本上我有一个逗号分隔整数的文本文件。我现在希望显示这些整数。我在Xcode,Apple LLVM上运行代码。我得到了正确的输出,但Xcode显示了一些奇怪的例外:
libc ++ abi.dylib:以未捕获的类型异常终止 std :: invalid_argument:stoi:没有转换程序以退出结束 代码:0
此消息在stoi
命令上带有断点。发生了什么?我怎么能顺利地做到这一点?
编辑:输入文本文件。
5,8,4,8,0,8,4,3,0,7,8,3,6,2,9,7,3,0,9,0,1,9,2,4,5,4,9,8,4,3,0,9,3,3,5,1,1,8,6,3,4,6,8,2,0,2,6,2,1,6,6,1,9,4,1,1,2,9,3,0,3,2,3,9,4,8,0,3,2,2,6,9,1,1,8,1,0,3,6,3,0,3,2,8,6,5,0,3,7,4,3,3,6,0,1,2,2,8,2,5,1,0,0,2,8,8,3,3,8,9,2,3,6,2,5,0,2,4,6,2,6,1,0,2,6,7,1,2,1,8,5,2,2,3,4,2,7,1,7,3,3,8,9,3,2,9,9,5,1,3,4,2,2,0,1,3,0,8,3,4,7,4,5,5,6,4,0,7,8,0,1,1,8,5,2,7,4,4,6,3,4,4,8,3,4,1,1,1,9,2,5,1,3,4,2,6,4,8,7,2,
否\n
即换行
答案 0 :(得分:1)
我认为这与您使用while (!eof())
的事实有关。这是一个错误的表达式,用作条件,因为它不符合IOStream的预期功能。您应该在执行输入之前检查输入是否成功:
while (std::getline(myfile, a, ','))
否则会导致流到达文件结尾,而字符串a
则没有值。然后将此空字符串传递给std::stoi
,从而导致抛出异常。
答案 1 :(得分:0)
这是一个例外,你没有代码可以捕获异常。
它被抛出,因为std::stoi
获得了无效的参数。在 this 的情况下,你至少有一个保证的情况会发生,那就是你最后一次循环迭代。这是因为您正在循环输入错误,因为已多次覆盖。
不要写while (!stream.eof())
或其等价物(哪个学习资源指示你这样做?)。当读取在EOF 失败时,EOF
设置为,而不是在下次读取失败时。因此,最终会有一个getline
太多。
while (getline(...))
。