考虑以下代码:
ifstream in;
try {
in.exceptions ( ifstream::failbit | ifstream::badbit );
in.open(pConfLocation);
} catch ( ifstream::failure e ) {
throw std::runtime_error("Can't open configuration file\n");
}
vector<string> lns;
string s;
in.clear();
while ( !in.eof() ){
getline( in, s );
boost::algorithm::trim(s);
lns.push_back( s+='\n');
}
所以:
- 我为 try-catch 块的需要设置了以下“异常掩码”( ifstream::failbit | ifstream::badbit )。该文件打开没有问题。
- 在 while{} 块中,我知道将在文件末尾设置 eofbit。但
异常掩码是所有流对象的内部值,用于指定哪些状态标志在设置时必须引发异常。
我没有设置ifstream::eofbit,但无论如何在运行时出现以下错误:
terminate called after throwing an instance of 'std::ios_base::failure'
what(): basic_ios::clear
The program has unexpectedly finished.
我无法理解这种行为。我尝试在while{}之前使用in.clear()但没有效果。clear() 本身设置goodbit,据我了解,“标志必须抛出异常”(参见上面的引用),但是当googbit设置时,它不会导致抛出任何异常......</p>
如果要删除
in.exceptions ( ifstream::failbit | ifstream::badbit );
有用。
在这种情况下如何使 getline() 工作?