@pixik

Как обнулить std::cin и заставить его ждать ввода?

Доброго времени друзья!
Наверное через эту проблему если не все, то многие проходили.
Есть программа, читает из std::cin и пишет в std::cout таким образом:
Код на c++:
std::string line;
while(true){
std::cin >> line;
std::сout << "out: " + line << std::endl;
}

Если программку запустить в консоли, то она повторяет пользовательский ввод:
text
out: text
a
out: a

Но если передать на стандартный ввод этой программки строку из другой программы, то получается следующее:
text
out: text
out:
out:
out:
...

... бесконечный цикл вывода считанной пустой строки.
Подскажите пожалуйста, как сделать так, чтобы программа ожидала ввода в cin и не считывала из него пустую строку? Ведь в самый первый раз запуска она ожидает ввода, и после первого же сообщения со стандартного ввода начинает бесконечно писать пустую строку. Может флажочек нужно поменять какой у cin ?

Всем спасибо за идеи и участие!
  • Вопрос задан
  • 2069 просмотров
Решения вопроса 1
@monah_tuk
Входная программа завершила писать и ваша получила 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;
    }


то вроде короче, и вроде работает, но будете постоянно выводить одну лишнюю строку (пустую или нет - от реализации), так что поверить статус стоит перед процессингом того, что получили.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Adamos
@Adamos
Вы читаете из cin, даже не проверяя, есть ли в нем что-нибудь. Получаете пустой результат в бесконечном цикле.
Проверьте вначале его rdstate(), что ли...
Ответ написан
Комментировать
Попробуйте считывать всю строку с помощью getline:
getline(cin, line);
Вместо:
cin >> line;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы