我正在尝试使用std::istream
解析文件,并希望使用异常来简化错误处理。但是,即使启用了 eof ,流也不会抛出异常。
请考虑以下代码段:
std::string line("Lorem ipsum");
std::istringstream is(line);
is.exceptions(std::ios::eofbit | std::ios::failbit);
std::string value1, value2, value3;
is >> value1;
std::cout << is.eof() << std::endl;
is >> value2;
std::cout << is.eof() << std::endl;
is >> value3;
std::cout << is.eof() << std::endl;
在阅读 value2 后,eof()
返回 true ,但即使指示了流,也不会抛出任何异常(参见第3行) 。最后, value3 包含一个空字符串。
我错过了什么?
如果重要:我使用的是LLVM libc ++,它是Xcode 4.6.1(支持C ++ 11的LLVM C ++)的一部分。
答案 0 :(得分:3)
我刚刚查看了libc ++实现和指定此行为的标准部分:
27.7.2.1班级模板basic_istream [istream] / p3:
如果
rdbuf()->sbumpc()
或rdbuf()->sgetc()
返回traits::eof()
,那么 输入功能,除非另有明确说明,否则完成 它的行为和setstate(eofbit)
可能会抛出ios_base::failure
(27.5.5.4),返回之前。
然后是p4:
如果其中一个被调用的函数抛出异常,则除非 另外明确指出,输入函数设置错误
badbit
州。如果badbit
中的exceptions()
处于启用状态,则输入函数将重新生成 没有完成其动作的异常,否则它不会 抛出任何东西并继续进行,好像被调用的函数已返回a 失败指示。
我认为这里的关键是对“其中一种被称为功能”的解释。我将该短语解释为引用前一段中提到的所有功能,包括setstate(eofbit)
。根据该解释,libc ++的行为是正确的,因为badbit
未设置。
要获得您想要的行为,请执行以下操作:
is.exceptions(std::ios::eofbit | std::ios::failbit | std::ios::badbit);