Ссылка: CppReference.com, "iostate"
getline()
возвращает ссылку на поток, в котором он работает, т.е. inpStrStream
.
inpStrStream.operator bool()
(или while ( inpStrStream )
/ while ( getline( inpStrStream, tempStr, '=' ) )
) проверит, установлены ли failbit
или badbit
потока.
! inpStrStream.eof()
проверит, установлен ли eofbit
потока.(*)
Состояния CppReference,
... почти во всех ситуациях, если установлено eofbit
, также установлено failbit
.
Вы попали в одно из исключений здесь..operator!()
проверяет failbit
, , а не для eofbit
- и что getline()
из "ABC"
устанавливает eofbit
(при достижении EOF потока), , ноне failbit
(так как эта последняя операция все еще была успешной).Это заставляет .eof()
завершить цикл (не печатая "ABC"
), в то время как .operator!()
выполнит еще одну итерацию (печатая "ABC"
), попробовав другую getline()
, которая завершится неудачей (так как больше нечего читать),установка failbit
и завершение цикла.
Итак ... .eof()
будет явно проверять только для EOF * , т.е. будет пытаться продолжить, даже если что-тоПроизошла неприятная ситуация с базовым потоком, для которого был установлен один из двух других флагов.
(*): Обратите внимание, что есть еще тесты.Единственными симметричными являются .fail()
и .operator!()
(которые проверяют одно и то же), а их симметричная противоположность .operator bool()
.Остальные - .good()
, .bad()
и .eof()
- проверяют разные вещи!