捕获并转换文件中的stings并执行数值运算

时间:2014-01-09 13:50:18

标签: c++ xcode string file-io

这是我的代码:

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即换行

2 个答案:

答案 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(...))