【问题标题】:Piping and Command Line arguments管道和命令行参数
【发布时间】:2013-12-12 08:58:10
【问题描述】:

问题已解决,代码重写如下:

#include <iostream>
#include <string>
#include <vector>

int main(int argc, char** argv){

    std::string input;
    std::vector<std::string> inputVector;

    while(std::getline( std::cin, input ) ){

        inputVector.push_back(input);
    }

    for(int i = 0; i < inputVector.size(); i++){

        std::cout << i << " of " << inputVector.size()-1 << " is " << inputVector[i] << "\n";

    }

    return 0;
}

顺便说一句,CMD 和 Powershell 中的输出在视觉上是不同的 - 在 Powershell 中执行此操作时看起来有两个结束线(也就是说,每个正确的行之间都有一个空行),我怀疑(但尚未调查)这是因为在 Powershell 行的末尾有很多空白,所以当您在前面添加 "xx of xx is " 时,该行会环绕。

=====================ORIGINAL=QUESTION=BENEATH=THIS=LINE=============== =====

这段代码应该只打印所有参数:

//dirparser.cpp
#include <iostream>

int main(int argc, char** argv){

    for( int i = 0; i<argc ; i++){

        std::cout << i << " of " << argc-1 << " is " << argv[i] << "\n";
    }

    return 0;
}

而且它似乎运行良好 - 如果我打电话给例如

dirparser.exe a b c

输出如预期:

0 of 3 is dirparser.exe
1 of 3 is a
2 of 3 is b
3 of 3 is c

但是当我这样做时,在命令行中:

dir | dirparser.exe   //In CMD
dir | .\dirparser.exe //In Powershell
ls | .\dirparser.exe  //In Powershell

我得到的输出是:

0 of 0 is dirparser.exe              //CMD
0 of 0 is [directory]\dirparser.exe  //Powershell
0 of 0 is [directory]\dirparser.exe  //Powershell

没有别的了。

这不是因为dir 和/或ls 什么都不返回——在没有管道的情况下单独调用这些命令会给我像往常一样的文件结构。我怀疑我遗漏了一些重要的东西——可能是关于管道行为——但我不知道应该从哪里开始。

【问题讨论】:

  • 管道不传递命令行参数。

标签: c++ windows cmd


【解决方案1】:

管道不适用于参数,但标准输入。

如果你想读取 lsdir 发送到你的程序的数据,你需要读取一个流:std::cin

一个基本的 C++ 示例:here

【讨论】:

  • 谢谢,看起来这个例子回答了我所有的问题。
【解决方案2】:

管道将标准输入传递给命令,而不是命令行参数。您需要使用标准输入读取“管道”。

【讨论】:

  • 太好了,谢谢。另外,显然为了防止垃圾邮件,我不能每 15 秒对超过一个人说谢谢,所以现在我正在打字打发时间。美好时光。
  • 你知道这是否在相反的方向上起作用 - 也就是说,有没有办法我可以将 dir 或其他一些命令写入 std::out 并以这种方式调用命令? (沼泽简单的解决方案,std::cout &lt;&lt; "dir";std::cout &lt;&lt; "dir\n"; 似乎不适用于此。)
  • 等等,不,这只是来自&lt;cstdlib&gt;system() 命令,忘了我问了。
【解决方案3】:

您使用命令行处理器 - 这是用户命令的相当复杂的解释器。所以这个解释器有一套规则——一些规则描述了如何启动你的程序,但一些规则修改了命令行处理器的行为。 |&amp;&gt;&lt; 是用于解释器的命令,但不适用于您的程序。这就是为什么它不被视为命令行参数的原因。但是您可以在引号的帮助下传递|

myprog "arg1 | arg2" 

但在这种情况下,它不是流的管道

【讨论】:

    猜你喜欢
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    相关资源
    最近更新 更多