请看下面的代码:
我不理解这种行为。我尝试在while{}之前使用in.clear(),但没有效果。clear()本身设置了goodbit,据我所知,“标志必须抛出异常”(见上面的引用),但当goodbit被设置时,并没有导致抛出任何异常...
如果删除in.clear(),则会导致无限循环。
考虑以下代码:
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,据我所知,“标志必须抛出异常”(见上面的引用),但当goodbit被设置时,并没有导致抛出任何异常...
如果删除in.clear(),则会导致无限循环。
in.exceptions ( ifstream::failbit | ifstream::badbit );
它可行。
如何使getline()在这种情况下工作?
clean()
成员函数,我猜你是指clear()
。clear()
函数会清除状态位(eofbit
、failbit
和badbit
),但不会影响异常掩码。 - Angew is no longer proud of SOgetline()
(设置failbit
的那个)将清除s
,然后你会处理一个空字符串(将"\n"
推入lns
),但这个空字符串从未是输入的一部分。换句话说,你得到了虚假数据。 - Angew is no longer proud of SOwhile (getline( in, s )) { boost::algorithm::trim(s); lns.push_back( s+='\n'); }
- Robᵩ