Я хотел бы проверить, достиг ли std :: istream
конца, не читая его.
Я знаю, что могу проверить EOF следующим образом:
if (is >> something)
но здесь есть ряд проблем. Представьте, что существует много, возможно виртуальных, методов / функций, которые ожидают, что std :: istream &
передан в качестве аргумента.
Я знаю, что могу проверить EOF следующим образом:
if (is >> something)
, но здесь есть ряд проблем. Представьте, что существует много, возможно виртуальных, методов / функций, которые ожидают, что std :: istream &
передан в качестве аргумента.
Я знаю, что могу проверить EOF следующим образом:
if (is >> something)
, но здесь есть ряд проблем. Представьте, что существует много, возможно виртуальных, методов / функций, которые ожидают, что std :: istream &
передан в качестве аргумента.
Это означало бы, что я должен выполнить «домашнюю работу» по проверке EOF в каждом из них, возможно, с другим типом переменной something
, или создать какую-то странную оболочку, которая обрабатывала бы сценарий вызова методов ввода.
Все, что мне нужно сделать, это:
if (!IsEof(is)) Input(is);
метод IsEof
должен гарантировать, что поток не будет изменен для чтения, так что приведенная выше строка эквивалентна:
Input(is)
в отношении прочитанных данных в методе Input
.
Если нет универсального решения, которое означало бы и std :: istream
, есть ли способ сделать это для std :: ifstream
или cin
?
РЕДАКТИРОВАТЬ:
Другими словами, следующее assert
всегда должно проходить:
while (!IsEof(is)) {
int something;
assert(is >> something);
}