На уровне стандартной библиотеки это не сделать, т.к. в std реализована определенная схема работы: ввод заканчивается нажатием Enter, до окончания ввода программа не контролирует входной поток, только затем все введенные символы передаются на обработку программе.
В простом варианте - читайте в строку, затем обрабатывайте каждый символ отдельно.
Но по уму вам нужно переводить терминал в "сырой" (raw) режим средствами ОС, в этом режиме появляется возможность обрабатывать каждую нажатую клавишу отдельно, не требуется подтверждение ввода Enterом и т.д. Но в работе в этом режиме std и ее стандартные объекты вам не помогут никак, нужно переходить на уровень ОС.
Можно поискать библиотеки, в которых реализован "сырой" ввод. Например в libuv это есть, но это кроме всего прочего еще и бибилотека ассинхронного ввода/вывода, что как бы добавляет сложностей.