- 主题:构造函数打开文件怎么处理打开失败的情况
如下的一个类:如何处理文件打开失败的情况,谢谢
/**
* DictParser is used to parse a file
* it parse a line every time
*/
class DictParser {
public:
DictParser(std::string path) : _fs(path) {};
~DictParser() {
_fs.close();
}
void add_column(ParserBase* p) {
_lp.add_parser(p);
}
int parse_next_line() {
std::string line;
std::getline(_fs, line);
return _lp.parse(line);
}
bool is_file_end() {
if (!_fs.good()) {
return true;
} else {
return false;
}
}
void reset_file(std::string path) {
_fs.close();
_fs.open(path);
}
private:
std::fstream _fs;
LineParser _lp;
DISALLOW_COPY_AND_ASSIGN(DictParser);
};
下面用这个类创建对象,并且打开文件;
。。。
DictParser dp("data/data.txt"); //DictParser is used to parse a file
。。。
--
FROM 111.206.214.*
throw,或者设置状态变量
前者是推荐的方式
--
修改:z16166 FROM 123.118.191.*
FROM 123.118.191.*
增加个operator bool()
--
FROM 175.188.167.*
什么文件?失败了会影响后续什么业务?没有影响的话告诉用户让用户确认文件是否存在不就行了?
【 在 steven2012 (未来的路) 的大作中提到: 】
: 如下的一个类:如何处理文件打开失败的情况,谢谢
: /**
: * DictParser is used to parse a file
: * it parse a line every time
--
FROM 223.104.3.*
小概率(5%),throw,大于5%可能性,要改变设计模式,如果是运行时会出现的,不在构造函数内打开,并将加bool open() 函数,不会在运行时出问题的(纯粹应该由使用者检查的),用assert
--
FROM 125.119.102.*
我现在修改的就是不用构造函数打开,而是增加open打开判断;就是还是笨办法;有没有办法不改变源代码构造函数打开方式,怎么判断打开失败异常处理呢?!
std::string path = "data/data.txt";
//DictParser dp("data/data.txt"); //DictParser is used to parse a file 之前构造函数打开方式
baidu::DictParser dp; //DictParser is used to parse a file
try {
dp._fs.open(path);
if(dp._fs.is_open()){
std::cout << "load file success!" << std::endl;
}else {
throw "open file error!";
}
} catch (std::exception &e) {
std::cout << "load error : " << e.what() << std::endl;
}
【 在 ziqin 的大作中提到: 】
: 小概率(5%),throw,大于5%可能性,要改变设计模式,如果是运行时会出现的,不在构造函数内打开,并将加bool open() 函数,不会在运行时出问题的(纯粹应该由使用者检查的),用assert
--
FROM 111.206.214.*
咱能专业点么? 又不是很难
【 在 nikezhang 的大作中提到: 】
: 什么文件?失败了会影响后续什么业务?没有影响的话告诉用户让用户确认文件是否存在不就行了?
--
FROM 111.206.214.*
能给实现一下么? 谢谢
【 在 pgw 的大作中提到: 】
: 增加个operator bool()
--
FROM 111.206.214.*
构造函数打开方式不变,怎么实现?!谢谢
【 在 z16166 的大作中提到: 】
: throw,或者设置状态变量
: 前者是推荐的方式
--
FROM 111.206.214.*
DictParser::DictParser(const std::string &path) {
_fs.exceptions(ifstream::badbit);
_fs.open(path);
};
try {
DictParser parser("/home/xxx/1.dict");
} catch (const ifstream::failure & e) {
}
【 在 steven2012 的大作中提到: 】
: 构造函数打开方式不变,怎么实现?!谢谢
--
FROM 123.118.191.*