用于接受stdin或CLI参数的设计模式

时间:2017-09-21 22:22:22

标签: c++ command-line-arguments stdin argv

对于C ++,如何接受CLI参数 stdin?

例如,让我说我有一个函数foo(),我想调用可变数量的参数。对于标准args,我只使用类似的东西:

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]);
        }
    }
}

但是如果他们通过stdin将它们发送给我并将参数传送到我的应用程序呢?有没有办法检测和接受/处理两者?在现代C ++(C ++ 11及更高版本)中实现这一目标的有效设计模式是什么?

我对设计模式/示例实现感兴趣。随意引用一个执行此操作的库(Boost?),但请分享/解释一个示例实现。

1 个答案:

答案 0 :(得分:2)

通常你只能从stdin读取输入,而不是参数/选项。通过读取和评估参数/选项,程序应该决定它是否期望来自stdin的输入或者例如文件参数。

例如manpage of grep

  

<强>概要

     

grep [OPTIONS] PATTERN [FILE ...]

     

<强>描述

     

grep搜索指定的输入文件(如果没有文件被命名,或者如果给出单个连字符 - ( - )作为文件名,则搜索标准输入)包含与给定PATTERN匹配的行。

缺少FILE参数或 - 选项表示 grep 读取标准输入。

您的程序的调用可能如下所示,缺少file参数表示从stdin读取输入:

# 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有program options library