Я создаю небольшой 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
Как правильно повторно использовать cin после EOF ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1768582989
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?
[b]Изменить:[/b]
После проверки битов сбоя после выполнения команды и перед очисткой это это результат:
eof: 1 bad: 0 fail: 1
Я использовал этот код:
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79869060/how-to-properly-reuse-cin-after-eof[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия