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);
我在这做错了什么?我感谢任何帮助,谢谢     
已邀请:
您的问题可能是循环再次处理超出预期。 在循环的最后一次,读取到单词失败,在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);
    
与诸如atof()之类的函数不同,它们在看到无效字符时立即停止解析,而lexical_cast要求输入字符串中的每个字符都有效。即任何前导或尾随空格都会导致它抛出异常。 你想看看它得到了什么样的输入并相应地修剪它。您还应该捕获bad_lexical_cast,以防它确实获得完全垃圾的输入。 一种可能的解决方案是使用boos.regex或boost.xpressive来提取有效的子字符串并将结果传递给lexical_cast。     
问题可能是您在没有数据时发送空字符串。 你应该改变你正在使用的循环。 使用while {}循环(而不是'do while'循环)。这允许您从流中读取并在一个易于阅读的语句中对其进行测试。注意iss >> word的结果是流。在此布尔上下文中使用时,将测试状态是否良好以及其值是否转换为while条件可以使用的值。因此,如果操作员>>申请正常工作,则永远不会输入循环。
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 */
}
    

要回复问题请先登录注册