问一个io流的问题
mul 2006-05-24 09:49:03 在vc71自带的io流实现的<istream>中,从648行起,basic_istream::read的实现
_Myt& read(_Elem *_Str, streamsize _Count)
{ // read up to _Count characters into buffer
ios_base::iostate _State = ios_base::goodbit;
_Chcount = 0;
const sentry _Ok(*this, true);
if (_Ok)
{ // state okay, use facet to extract
_TRY_IO_BEGIN
const streamsize _Num = _Myios::rdbuf()->sgetn(_Str, _Count);
_Chcount += _Num;
if (_Num != _Count)
_State |= ios_base::eofbit | ios_base::failbit; // short read
_CATCH_IO_END
}
_Myios::setstate(_State);
return (*this);
}
如果_Myios::rdbuf()->sgetn(_Str, _Count)抛出异常,会被_TRY_IO_BEGIN,_CATCH_IO_END catch住(默认行为,定义_HAS_EXCEPTIONS),然后将state置为badbit,然后跳到语句:_Myios::setstate(_State);但是这里的_State却是goodbit,又把流状态置为正常了。
调用者岂不是用stream.good()也没办法正确判断流状态?
难道我一定要在我的实现(streambuf继承)里将异常捕获返回错误(eof)才能适合这种read方法?