标准文件流中对文件结尾符处理的原理是: eof()判断流标识位的eofbit是否设置了,若是则返回-1,文件结束。
bool __CLR_OR_THIS_CALL eof() const
{ // test if eofbit is set in stream state
return ((int)rdstate() & (int)eofbit);
}
这么看来,在每个对文件读取而导致文件指针移动的标准流函数中,如ifstream::read(),c++标准文件流系统应该负责检测文件读取缓存中可用字符是否已读完,即流指针是否已到文件结束符。然而,它却忘记了!看下面的代码:
_Myt& __CLR_OR_THIS_CALL read(_Elem *_Str, streamsize _Count)
{ // read up to _Count characters into buffer
_DEBUG_POINTER(_Str);
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);