iostream, некоторые вопросы - PullRequest
       8

iostream, некоторые вопросы

5 голосов
/ 26 февраля 2010

Я видел, как люди делают такие вещи, как ....

 istringstream ibuf;

 if (ibuf >>  zork >> iA >> Comma >> iB)

теперь я думаю, что значение зависит от того, что >> выставляет iB, но что именно это и что это значит? Означает ли это, что все ietms были извлечены?

Также после выражения типа

 ibuf >>  zork >> iA >> Comma >> iB;

есть ли способ узнать, сколько символов и предметов было извлечено?

Ответы [ 3 ]

3 голосов
/ 27 февраля 2010

Это работает из-за двух свойств объектов istream:

  • istreams возвращаются после каждого извлечения (оператор >>), чтобы разрешить цепочку множественных извлечений (a >> b >> c)
  • istreams возвращают свой статус (как если бы .good() вызывали), когда они приводятся / преобразуются в bool, через перегрузку bool operator !()

В основном написанный вами код является сокращенной версией:

if ( ((((ibuf >> zork) >> ia) >> Comma) >> ib).good() ) {

}

После того, как все извлечения произошли, у вас остается if (ibuf), что неявно похоже на запись if ((bool)ibuf), который проверяет ibuf.good().

Невозможно получить количество символов, извлеченных за серию цепочек извлечений, но вы можете найти количество символов, извлеченных во время последней операции, с помощью функции gcount . Однако он работает только для определенных функций игнорирования формата, таких как get и getline, но не для оператора извлечения.

1 голос
/ 27 февраля 2010

Второй фрагмент кода считывает набор значений из ibuf в переменные, следующие за ним. Однако возвращение скрытого вызова operator >>() является объектом istringstream. Нет прямого способа узнать количество персонажей.

Вы можете проверить функцию-член gcount, которая дает количество символов для последней неотформатированной операции ввода. Обратите внимание, что это для каждой операции, поэтому каскадирование не может быть использовано. Вы также можете использовать функцию-член read.

Edit:

(ibuf >>  zork >> iA >> Comma >> iB)

на самом деле:

((((ibuf.operator >>(zork)).operator >>(iA)).operator >>(Comma)).operator >>(iB))

Уровень вложенности в скобках указывает порядок вызовов (и аргументы).

0 голосов
/ 27 февраля 2010
if (ibuf >>  zork >> iA >> Comma >> iB)

логически равно:

ibuf >> zork;
ibuf >> iA;
ibuf >> Comma;
ibuf >> iB;
if (ibuf) ...

"Есть ли способ узнать, сколько символов и предметов было извлечено?"

Есть функция-член "gcount": http://www.cplusplus.com/reference/iostream/istream/gcount/

...