2012-05-19 35 views
0

我正在從文本文件中讀取數據,並且存在需要從文件中讀取的double值。現在的問題是,如果雙重值無效,例如「!@#$%^ & *」,那麼我希望我的程序給出異常,以便我可以處理它。這是我的代碼在C++中轉換爲double時處理異常

void Employee::read(istream &is) { 
    try{ 

     is.get(name, 30); 
     is >> salary; 
     char c; 

     while(is.peek()=='\n') 
      is.get(c); 

    } 
    catch(exception e){ 
    } 
} 
+0

你可以嘗試將它輸入到一個字符串中,如果你有C++ 11,可以使用'stod'。這會拋出一個'std :: invalid_argument'異常。 – chris

+1

我終於通過設置istream的異常位來工作,它是isdream \t 'is.exceptions(ios :: failbit | ios :: badbit); \t //設置ifstream拋出壞數據異常 –

+0

有趣的是,我從來不知道你可以做到這一點。您可以將它作爲答案發布並接受它。 – chris

回答

2

我終於做到了通過對istream的

設置例外位工作
is.exceptions(ios::failbit | ios::badbit); //setting ifstream to throw exception on bad data 
3

這裏是驗證輸入的可運行的例子。

#include<iostream> 
#include<sstream> 
#include<limits> 
using std::numeric_limits; 
int main(){ 
    std::string goodString = "12.212", badString = "[email protected]$&*@"; 
    std::istringstream good(goodString), bad(badString); 
    double d1=numeric_limits<double>::min(), 
      d2=numeric_limits<double>::min(); 
    std::string tmp; 

    good >> d1; 
    if (d1 == numeric_limits<double>::min()) { 
     // extraction failed 
     d1 = 0; 
     good.clear(); // clear error flags to allow further extraction 
     good >> tmp; // consume the troublesome token 
     std::cout << "Bad on d1\n"; 
    } else std::cout << "All good on d1\n"; 

    if (d2 == numeric_limits<double>::min()) { 
     d2 = 0; 
     bad.clear(); 
     bad >> tmp; 
     std::cout << "Bad on d2\n"; 
    } else std::cout << "All good on d2\n"; 
} 

產生的輸出是..

都好於D1

壞於D2