Входная программа завершила писать и ваша получила EOF. Всё, баста карапузики. Проверяйте статус ввода и завершайтесь - больше вы данных не получите, никогда и ни при каких условиях.
Не верите? Отправьте на stdin не одну строку, а файл: выведется правильно файл, а потом посыпят пустые строки или последний токен - зависит от реализации.
Обратите внимание на слово токен - у вас разделение по пробелу будет. Что бы читать строку, используйте std::getline().
За флагами:
www.cplusplus.com/reference/ios/ios/eof
www.cplusplus.com/reference/ios/ios/fail
www.cplusplus.com/reference/ios/ios/bad
Ну а ваш код, по сути, должен стать таким:
while (true) {
std::getline(std::cin, line);
if (!std::cin)
break;
std::cout << "out: " + line << std::endl;
}
обратите внимание, что если вы сделаете так:
while (std::cin) {
std::getline(std::cin, line);
std::cout << "out: " + line << std::endl;
}
то вроде короче, и вроде работает, но будете постоянно выводить одну лишнюю строку (пустую или нет - от реализации), так что поверить статус стоит перед процессингом того, что получили.