一位同事告诉我这段代码:
std::ifstream stream(filename.c_str());
if (!stream)
{
throw std::runtime_error("..");
}
会错的。如果开放成功,他说ifstream
评估为0。我的代码有效,但我想查找文档,但没有看到它说明如何检查开放是否成功。你能指点我吗?
答案 0 :(得分:42)
operator!
的{p> std::ifstream
is overloaded,因此可以执行此操作。
在我看来,这是对运营商超载的严重滥用(由标准委员会)。如果你只是做if (stream.fail())
,那么你要检查的更明确。
答案 1 :(得分:10)
您也可以使用is_open()检查它是否有效,但是!是允许的(它不是检查零,它是一个特殊的overload of !)
编辑:
只是出于兴趣 - 为什么不抛出异常呢?
只是在异常之前引入了流
或者我们是否进入了旧的C ++ - 它只是一个错误,不足以成为例外。
答案 2 :(得分:10)
您可以通过使用正确的位掩码调用其ios::exceptions()函数,使特定流在任何eof / fail / bad上抛出异常。因此,您可以在上面的初始问题中重写示例:
std::ifstream stream;
stream.exceptions(std::ios::failbit | std::ios::badbit);
stream.open(filename.c_str());
当failbit或badbit设置时,stream会抛出异常。例如,如果ifstream::open()失败,它将设置failbit并抛出异常。当然,如果在流上设置了这些位中的任何一个,这将引发异常,因此这个重写与初始示例不完全相同。你可以打电话
stream.exceptions(std::ios::goodbit);
取消流上的所有异常,然后返回检查错误。
答案 3 :(得分:3)
你的同事错误。也许他忘记了你不是在写C。
代码是现货。它完全你应该如何检查流状态。