C ++ stoi有时会发送带有空格的异常

时间:2016-05-19 13:18:58

标签: c++ visual-studio c++11 integer

所以对某些人来说这可能是一个非常明显的问题,但我不知道从哪里开始这个错误。

我有一些代码从.txt文件读取一些字符串,所有字符串都有一个":"然后经过一个数字。例如:

每种颜色的对象:1

机器人数量:10

预定义位置:1

当我手动编辑值时,stoi工作正常,但是当ac#代码将值写入同一个文件时(注意我已经手动检查,并且有相同的,没有多余的空格,没有多余的字符,没有什么视觉上的不同)stoi抱怨。我的代码是下一个:

C ++:

cout << "Number..." << endl;
cout << dataLine.substr(dataLine.find_first_of(":")+1) << endl;
try{
    cfgVals.push_back(stoi(dataLine.substr(dataLine.find_first_of(":")+1)));    
}catch(exception& ex){
    cout << ex.what() << endl;
}

在这两种情况下,数据线的cout发送一个空格,然后是数字&#34; 1&#34;或&#34; 10&#34 ;.当我编辑文件时,stoi不会抛出异常,但是由其他程序编辑,它确实(但是它似乎无论如何都要进行转换)。

我用来在c#中编写文件的命令非常简单:

File.WriteAllLines(@nameFile, param);

其中param是字符串列表。

希望我很清楚,任何想法?提前谢谢!

2 个答案:

答案 0 :(得分:1)

如果您发现C ++程序的行为取决于创建输入文件的程序,则应检查该C#程序使用的编码以及用于从文本处理器保存文件的编码。您也可以在此处发送创建此文件的C#程序代码。

答案 1 :(得分:0)

是的,如果stoi没有得到可以转换成整数的输入,它将抛出异常 - 空格字符不是数字,也不能是数字的一部分。您可以通过删除前面的空间然后将其输送到stoi来修剪输入,这应该可以解决您的问题。

string trim(string num)
{
  string res = "";
  if (num[0] == ' ') {
    res = num.substr(1);
  }
  return res;
}

这应该可以胜任,假设前面是唯一有空格字符的地方