Если поток отформатирован, вы не можете просто проверить его длину?
Anways, std::istream::operator>>
для C ++ 98:
Функция считается для выполнения форматированного ввода : внутренне, функция обращается к последовательности ввода, сначала создавая часовой объект (с noskipws, установленным в false). Затем (если это хорошо) он извлекает символы из связанного с ним объекта потокового буфера, как если бы он вызывал свои функции-члены sbump c или sget c, и, наконец, уничтожает объект sentry перед возвратом.
Для C ++ 11:
Считается, что функция выполняет неформатированный ввод : внутренне функция обращается к входной последовательности, сначала создавая объект sentry (для noskipws установлено значение true). Затем (если это хорошо) он извлекает символы из связанного с ним объекта потокового буфера, как если бы он вызывал функции-члены sbump c или sget c, и, наконец, уничтожает объект sentry перед возвратом. Количество символов, успешно прочитанных и сохраненных этой функцией, можно узнать, вызвав член gcount .
Так что кажется, что вы можете считать только символы из неформатированного ввода.
Но:
Неформатированные операции ввода, которые изменяют значение, возвращаемое этой функцией (gcount()
): get, getline, ignore, peek, read, readsome, putback и unget.
Обратите внимание, что peek, putback и unget фактически не извлекают никаких символов, и, следовательно, gcount всегда будет возвращать ноль после вызова любого из них.
Так что, возможно, вы можете использовать, для экземпляр, istream& getline (istream& is, string& str);
или std::istream::get
, чтобы получить gcount()
для подсчета отформатированного потока,