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

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

 istringstream ibuf;

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

теперь я предполагаю, что значение зависит от того, что>> iB выставляет, но точно что то, что и что это означает? Делает верный средний, все объекты были извлечены?

Кроме того, после выражения как

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

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

5
задан Mike D 26 February 2010 в 20:57
поделиться

3 ответа

Это работает благодаря двум свойствам объектов istream:

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

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

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

}

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

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

3
ответ дан 15 December 2019 в 00:59
поделиться

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

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

Изменить:

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

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

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

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

1
ответ дан 15 December 2019 в 00:59
поделиться
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/

0
ответ дан 15 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: