Порядок работы cin

Как пошагово работает объект cin, в подробностях. То есть:

  1. Ввод в консоль
  2. Сохранение в буфер И т.д.

Есть ли последующие или промежуточные звенья?


Ответы (2 шт):

Автор решения: Matvj

cin с одной переменной

Сначала происходить ввод в консоль, пока пользователь не нажмёт enter. Во время ввода данные хранятся в буфере¹.

Если мы поставим пробел начнётся новый буфер ввода, но он не будет сохранён в переменную, а будет просто очищен.

По окончанию ввода данные из буфера записываются в переменную. Затем буфер очищается.

cin с несколькими переменными

Сначала происходит ввод в консоль если мы ставим пробел, то начинается новый буфер. В это время данные хранятся в буферах. Ввод заканчивается, когда пользователь нажмёт enter.

По окончанию ввода данные из соответствующих буферов переписываются в соответствующие переменные. Затем буфера очищаются.


1 - здесь и дальше под словом буфер подразумевается буфер ввода.

→ Ссылка
Автор решения: Harry

Отвечая на вопрос в комментариях.

Ну, наверное, я все же допускаю предельно странную реализацию с несколькими физическими буферами (потому и написал — детали реализации), но куда проще и логичнее иметь дело с одним. Тем более что логически он один и есть.

Согласно стандарту, istream (все basic_ опущены для краткости) использует streambuf, каковой и есть единственный логический буфер потока, и работает через этот буфер (еще раз — логически единственный, а что там на низком уровне начудить можно — дело второе. Но если про него почитать, то становится очевидно, что использовать несколько физических буферов хоть и можно, но геморрой при этом получится знатный. Так что готов спорить, что реализаций с множественными буферами просто не найти.)

Более того, используя setbuf(), вы можете использовать собственный буфер. Что как бы подчеркивает, что он один в любом случае — не представляю, зачем делать несколько буферов при работе с внутренней реализацией буфера, но один с внешней. Логично всегда иметь один буфер, код будет проще. Да и реализация всех функций для перемещения указателей по буферу в этом случае проще.

Так что несмотря на то, что стандарт об этом прямо не говорит, физический буфер потока все же единственный.

P.S. Знатоки стандарта, нет ли в стандарте прямого указания, что физический буфер единственный? А то я оставляю лазейку для особо извращенных :), но не уверен, что не зря это делаю...

→ Ссылка