std :: istream不会抛出eof异常(已启用)

时间:2013-03-27 12:30:40

标签: c++ stl llvm istream

我正在尝试使用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 ++)的一部分。

1 个答案:

答案 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);