2012-05-19 2 views
0

텍스트 파일에서 데이터를 읽고 있는데이 파일에서 읽어야하는 double 값이 있습니다. 이제 문제는 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에 예외 비트를 설정하여 작동하게했습니다. \t 'is.exceptions (ios :: failbit | ios :: badbit); \t // 잘못된 데이터에 대한 예외를 throw하도록 ifstream을 설정하십시오. –

+0

흥미 롭습니다. 답변으로 게시하고 수락 할 수 있습니다. – chris

답변

2

I는 마침내 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에

나쁨