Я видел, что люди делают вещи как....
istringstream ibuf;
if (ibuf >> zork >> iA >> Comma >> iB)
теперь я предполагаю, что значение зависит от того, что>> iB выставляет, но точно что то, что и что это означает? Делает верный средний, все объекты были извлечены?
Кроме того, после выражения как
ibuf >> zork >> iA >> Comma >> iB;
там какой-либо путь состоит в том, чтобы узнать сколько символов и объектов, где извлечено?
Это работает благодаря двум свойствам объектов istream:
>>
), чтобы разрешить объединение нескольких извлечений ( a >> b >> c
) .good ()
), когда они приводятся / преобразуются в bool, через перегрузку оператора bool! ()
По сути, написанный вами код является сокращенной версией:
if ( ((((ibuf >> zork) >> ia) >> Comma) >> ib).good() ) {
}
После того, как все извлечения произойдут, вы останетесь с if (ibuf)
, что неявно похоже на запись if ((bool) ibuf)
, которая проверяет ibuf.good ()
.
Невозможно получить количество символов, извлеченных за серию связанных извлечений, но вы можете узнать количество символов, извлеченных во время последней операции, с помощью функции gcount . Однако он работает только для определенных функций, игнорирующих формат, таких как get
и getline
, но не для оператора извлечения.
Вторая часть кода считывает набор значений из ibuf
в следующие за ним переменные. Однако возвращение скрытого вызова оператора >> ()
- это объект istringstream
. Нет прямого способа получить количество символов.
Вы можете проверить функцию-член gcount
, которая дает количество символов для последней неформатированной операции ввода. Обратите внимание, что это для каждой операции, поэтому каскадирование использовать нельзя. Вы также можете использовать функцию-член read
.
Изменить:
(ibuf >> zork >> iA >> Comma >> iB)
на самом деле:
((((ibuf.operator >>(zork)).operator >>(iA)).operator >>(Comma)).operator >>(iB))
Уровень вложенности скобок сообщает вам порядок вызовов (и аргументов).
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/