Например,
, если бы вы сделали входной поток int, то вы бы дали ввод, например - 45 56 45345 555 ....., так что во всех этих случаях операция чтения входного потока вернулась бы истинное значение - while (cin>>var) { }
оператор while не остановится, если получит допустимый ввод, поэтому чтобы остановить чтение символов, мы дали ему следующий ввод, ... 54 56 3545 | и как только он получает специальный символ, цикл while останавливается, когда условия возвращают false.
То же самое относится и ко всем другим типам входных потоков.
Итак, я предполагаю, что вы понимаете здесь, почему ваш поток ввода строкового типа никогда не прекращает принимать ввод, потому что каждый возможный ввод можно считать строкой.
Решением этой проблемы является использование "ctrl + D в UNIX" и "ctrl + Z в windows", поскольку оно дает значение NULL в состоянии цикла while, что означает ложь, следовательно, останавливает чтение ввода строки.