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

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

Сообщение Anonymous »

Я создаю небольшой CLI на C++ для студенческого проекта, и одним из требований является то, что некоторые команды могут использовать стандартный ввод для ввода. Например, если пользователь вводит echo без аргумента, программа считывает введенные пользователем данные из стандартного ввода до тех пор, пока не будет достигнут EOF (в Unix-подобных системах это называется CTRL+D или в Windows CTRL+Z). Моя проблема в том, что после достижения EOF cin становится непригодным для использования. Мое текущее решение имеет базовый класс Command, из которого получены конкретные команды, такие как Echo. В классе Command есть метод, который вызывается при выполнении команды: выполнить(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 плохо: 0 сбой: 1
используется:

Код: Выделить всё

std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/79869060/how-to-properly-reuse-cin-after-eof[/url]
Ответить

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

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

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

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

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