Как правильно повторно использовать cin после EOFC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как правильно повторно использовать cin после EOF

Сообщение Anonymous »

Я создаю небольшой CLI на C++ для студенческого проекта, и одним из требований является то, что некоторые команды могут использовать стандартный ввод для ввода. Например, если пользователь вводит echo без аргумента, программа считывает вводимые пользователем данные из стандартного ввода до тех пор, пока не будет достигнут EOF (оно говорит CTRL+D в Unix-подобных системах или CTRL+Z в Windows).
Моя проблема в том, что после достижения EOF cin становится непригодным для использования.
Мое текущее решение имеет базовый класс Command, из которого создаются конкретные команды, такие как Echo получены из. В классе Command есть метод, который вызывается при выполнении команды:
execute(std::istream& in, std::ostream& out, std::ostream& err)
Моя идея состоит в том, чтобы проверить, является ли входной поток команды cin после выполнения, а затем, если это так, вызвать метод cin.clear(), чтобы очистить флаг EOF. Это работает нормально, когда я запускаю свою программу в Windows, но когда я запускаю ее в Linux, возникают проблемы. Поскольку мне нужно реализовать пакетную команду, которая преобразует входной поток CLI в файл, у меня есть стек входных потоков.
std::istream& in = getCurrentInput();
std::string line;
if (!std::getline(in, line, '\n')) {
if (m_inputStack.size() > 1) m_inputStack.pop();
else m_running = false;
}

Проблема в том, что даже после очистки cin в Linux программа вводит этот оператор if, как будто ошибка все еще существует. Добавлениеcleerr(stdin) вместе с cin.clear(), кажется, решает проблему, но мне не нравится этот подход, поскольку он выглядит как код C.
Как правильно обработать такое поведение, чтобы оно работало как в Windows, так и в Linux?

Изменить:
После проверки битов сбоя после выполнения команды и перед очисткой это это результат:
eof: 1 bad: 0 fail: 1

Я использовал этот код:
std::cout

Подробнее здесь: https://stackoverflow.com/questions/798 ... -after-eof
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»