Я создаю небольшой 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