管道和命令行参数

时间:2013-12-12 08:58:11

标签: c++ windows cmd

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

#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 =行=============== =====

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

//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没有返回任何内容 - 在没有管道的情况下单独调用这些命令会像往常一样给我文件结构。我怀疑我错过了一些必要的东西 - 可能是关于管道行为 - 但我对于应该从哪里开始我一无所知。

3 个答案:

答案 0 :(得分:3)

管道传递stdin到命令,而不是命令行参数。你需要使用stdin读取'pipe'。

答案 1 :(得分:2)

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

如果您想阅读 ls dir 发送到您的程序的数据,您需要阅读一个流:std::cin

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

答案 2 :(得分:1)

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

myprog "arg1 | arg2" 

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