Порядок работы cin
Как пошагово работает объект cin
, в подробностях.
То есть:
- Ввод в консоль
- Сохранение в буфер И т.д.
Есть ли последующие или промежуточные звенья?
Ответы (2 шт):
cin с одной переменной
Сначала происходить ввод в консоль, пока пользователь не нажмёт enter. Во время ввода данные хранятся в буфере¹.
Если мы поставим пробел начнётся новый буфер ввода, но он не будет сохранён в переменную, а будет просто очищен.
По окончанию ввода данные из буфера записываются в переменную. Затем буфер очищается.
cin с несколькими переменными
Сначала происходит ввод в консоль если мы ставим пробел, то начинается новый буфер. В это время данные хранятся в буферах. Ввод заканчивается, когда пользователь нажмёт enter.
По окончанию ввода данные из соответствующих буферов переписываются в соответствующие переменные. Затем буфера очищаются.
1 - здесь и дальше под словом буфер подразумевается буфер ввода.
Отвечая на вопрос в комментариях.
Ну, наверное, я все же допускаю предельно странную реализацию с несколькими физическими буферами (потому и написал — детали реализации), но куда проще и логичнее иметь дело с одним. Тем более что логически он один и есть.
Согласно стандарту, istream
(все basic_
опущены для краткости) использует streambuf
, каковой и есть единственный логический буфер потока, и работает через этот буфер (еще раз — логически единственный, а что там на низком уровне начудить можно — дело второе. Но если про него почитать, то становится очевидно, что использовать несколько физических буферов хоть и можно, но геморрой при этом получится знатный. Так что готов спорить, что реализаций с множественными буферами просто не найти.)
Более того, используя setbuf()
, вы можете использовать собственный буфер. Что как бы подчеркивает, что он один в любом случае — не представляю, зачем делать несколько буферов при работе с внутренней реализацией буфера, но один с внешней. Логично всегда иметь один буфер, код будет проще. Да и реализация всех функций для перемещения указателей по буферу в этом случае проще.
Так что несмотря на то, что стандарт об этом прямо не говорит, физический буфер потока все же единственный.
P.S. Знатоки стандарта, нет ли в стандарте прямого указания, что физический буфер единственный? А то я оставляю лазейку для особо извращенных :), но не уверен, что не зря это делаю...