Получить количество прочитанных символов от форматированной операции ввода - PullRequest
1 голос
/ 29 января 2020

Я читаю числа из istream, используя перегрузку оператора >>. Это прекрасно работает, но теперь мне нужно знать, сколько символов было использовано этой операцией. В настоящее время я использую что-то вроде

int startPos = in.tellg();
double number;
in >> number;
int readChars = in.tellg() - startPos;

. В некоторых случаях это работает, но вполне нормально agile. При использовании std::cin в качестве in это вообще не работает (я предполагаю, что это потому, что std::cin не имеет позиции в потоке, а потенциально бесконечной).

Мой вопрос (я думаю) довольно прост: как я могу получить количество символов, которые были прочитаны при использовании оператора >>?

Во время поиска я обнаружил gcount () , но это работает только для неформатированного ввода.
Документация по оператору >>, похоже, также не дает подсказки : http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/

1 Ответ

1 голос
/ 29 января 2020

Если поток отформатирован, вы не можете просто проверить его длину?

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() для подсчета отформатированного потока,

...