2010-02-25 56 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 */ 
}