2010-02-25 93 views
2

我对C++使用boost库,函数lexical_cast的行为真的很奇怪。如果我做lexical_cast(“0.07513994”),它工作正常,但如果我使用我需要转换的变量,它会抛出bad_lexical_cast异常。下面是代码:boost lexical_cast抛出异常

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

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

+1

请显示流中的完整输入。 – 2010-02-25 11:38:58

+0

线的实际价值是多少?它''lexical_cast'会抛出,如果它无法转换。在调用词法转换之前检查“word”的字符串值,您可能会发现它不是您所相信的。 – 2010-02-25 11:39:06

+0

它可能是行结尾像'\ n'这样的空格吗? – 2010-02-25 11:51:29

回答

2

你的问题可能是循环处理比预期多一次。 通过循环的最后一次,读到字失败,在iss中设置失败位,这是(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); 
+0

非常感谢Michael – Student 2010-02-25 12:10:39

+6

或者摆脱do-while循环,并使用'while(iss >> word){...}'的简单while循环。通过这个do-while循环,条件基本上是多余的。 – 2010-02-25 13:07:04

+0

约翰内斯解决方案肯定是整洁。我只是想强调原帖中出了什么问题。 – 2010-02-25 13:32:41

2

不同的功能,如ATOF(),它停止,尽快为他们看到无效字符解析,lexical_cast的要求输入字符串的每一个字符是有效的。即任何前导或尾随空格都将导致它抛出异常。

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

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

2

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

使用while {}循环(而不是'do while'循环)。这使您可以从流中读取数据并通过简单易读的语句对其进行测试。请注意iss >> word的结果是流。当在这个布尔上下文中使用时,它会被测试以查看状态是否良好,并将其值转换为while条件可以使用的值。因此,如果操作员>>提交正常工作,则循环永远不会输入。

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

但实际上你甚至不需要在这种情况下词法投(除非你想测试非数字与一个例外)。标准流操作符会将输入转换为双精度。

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