boost lexical_cast抛出异常

时间:2010-02-25 11:35:19

标签: c++ boost lexical-cast

我正在为c ++使用boost libs,而lexical_cast函数表现得非常奇怪。如果我做lexical_cast(“0.07513994”)它工作正常,但如果我使用我需要转换的变量,它会抛出bad_lexical_cast异常。这是代码:

string word;
istringstream iss(line);
do
{
   string word;
   iss >> word;        
   double x;
   x = lexical_cast<double>(word);   
   cout << x << endl;
} while (iss);

我在这里做错了什么?我感谢任何帮助,谢谢

3 个答案:

答案 0 :(得分:2)

您的问题可能是循环再次处理超出预期。 在循环的最后一次,读取到单词失败,在iss中设置失败位,这是while(iss)正在检查的内容。要修复它,你需要做这样的事情。

string word;
istringstream iss(line);
do
{
   string word;
   iss >> word; 
   if(iss)
   {       
     double x;
     x = lexical_cast<double>(word);   
     cout << x << endl;
   }
} while (iss);

答案 1 :(得分:2)

与atof()等函数不同,它们在看到无效字符后立即停止解析,而lexical_cast要求输入字符串中的每个字符都有效。即任何前导或尾随空格都会导致它抛出异常。

你想看看它得到了什么样的输入并相应地修剪它。您还应该捕获bad_lexical_cast,以防它确实获得完全垃圾的输入。

一种可能的解决方案是使用boos.regex或boost.xpressive来提取有效的子字符串并将结果传递给lexical_cast。

答案 2 :(得分:2)

问题可能是当没有数据时你发送一个空字符串。
你应该改变你正在使用的循环。

使用while {}循环(而不是'do while'循环)。这允许您从流中读取并在一个易于阅读的语句中对其进行测试。注意iss的结果&gt;&gt;字是流。在此布尔上下文中使用时,将测试状态是否良好以及其值是否转换为while条件可以使用的值。因此,如果运营商&gt;&gt;申请正常工作,然后永远不会进入循环。

istringstream iss(line);
string        word;
while(iss >> word)
{
    double x = lexical_cast<double>(word);   
    cout << x << endl;
}

但实际上你甚至不需要在这种情况下进行词法演员(除非你想测试非数字的例外情况)。标准流操作符将输入转换为double。

istringstream iss(line);
double        word;
while(iss >> word)
{
    cout << word << endl;
}
if (iss.fail())
{    /* Failure to convert input to a double */
}