0

我正在从文本文件中读取数据,并且需要从文件中读取双值。现在的问题是,如果双精度值无效,例如“!@#$%^&*”,那么我希望我的程序给出异常以便我可以处理它。这是我的代码

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

这是验证双重输入的可运行示例。

#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 回答