Шаблон проектирования для приема аргументов стандартного ввода ИЛИ CLI

Как для C++ принимать аргументы CLI или stdin?

Например, допустим, у меня есть функция foo(), которую я хочу вызвать с переменным числом аргументов. Для стандартных аргументов я просто использую что-то вроде:

int main(int argc, char* argv[]) {
    if (argc < 2) {
        std::cout << "usage goes here.\n";
    } else {
        for (int i; i < argc; ++i) {
            foo(argv[i]);
        }
    }
}

Но что, если они отправят их мне через стандартный ввод и передают параметры моему приложению? Есть ли способ обнаружить и принять/обработать оба? Каков эффективный шаблон проектирования для этого в современном С++ (С++ 11 и выше)?

Меня интересует шаблон проектирования/пример реализации. Не стесняйтесь ссылаться на библиотеку, которая делает это (Boost?), но, пожалуйста, поделитесь/объясните пример реализации.


person cpp_n00b    schedule 21.09.2017    source источник


Ответы (1)


Обычно вы читаете только ввод со стандартного ввода, а не аргументы/параметры. Читая и оценивая аргументы/параметры, программа должна решить, ожидает ли она ввода от стандартного ввода или, например, от stdin. аргумент файла.

Например, на справочной странице grep:

Краткий обзор

grep [ОПЦИИ] ШАБЛОН [ФАЙЛ...]

Описание

grep ищет именованные входные ФАЙЛЫ (или стандартный ввод, если нет файлов с именами или если в качестве имени файла указан один дефис-минус (-)) строки, содержащие соответствовать заданному ШАБЛОНУ.

Отсутствие аргумента FILE или опции - указывает grep на чтение стандартного ввода.

Вызов вашей программы может выглядеть так: отсутствие аргумента файла указывает на чтение ввода со стандартного ввода:

# file argument, input is in the file
command -o someoption filename

# file content supplied via stdin
command -o someoption < filename     

# with pipe and - (stdin) as file argument
othercommand | command -o someoption -

Для разбора параметров/аргументов у boost есть библиотека опций программы

person LeBlue    schedule 21.09.2017