0

テキスト ファイルからデータを読み取っていますが、ファイルから読み取る必要がある double 値があります。ここでの問題は、「!@#$%^&*」などの 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){
    }
}
4

2 に答える 2

3

double入力を検証する実行可能な例を次に示します。

#include<iostream>
#include<sstream>
#include<limits>
using std::numeric_limits;
int main(){
    std::string goodString = "12.212", badString = "!@$&*@"; 
    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 が悪い

于 2012-05-19T06:21:00.813 に答える
2

istreamの例外ビットをオンに設定することで、最終的に機能させました

is.exceptions(ios::failbit | ios::badbit);  //setting ifstream to throw exception on bad data
于 2012-05-19T10:33:28.760 に答える