2013-12-12 78 views
1

的问题已经解决了,代码重写如下:管道和命令行参数

#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什么都不返回 - 单独调用那些没有管道的命令给我的文件结构照常。我怀疑我错过了一些必不可少的东西 - 可能是关于管道的行为 - 但我对我应该从哪里开始毫无头绪。

+2

管道没有通过命令行参数的管道。 – chris

回答

2

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

如果你想阅读LSDIR到程序发送数据,你需要阅读流:std::cin

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

+0

谢谢,看起来这个例子回答了我所有的问题。 – medivh

3

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

+0

太好了,谢谢。此外,显然为了防止垃圾邮件,我不允许对每15秒钟超过一个人表示感谢,所以现在我打字打发时间。美好时光。 – medivh

+0

你知道这是否可以在相反的方向工作 - 也就是说,有没有办法将'dir'或其他命令写入std :: out并以这种方式调用命令? (这个简单的解决方案,'std :: cout <<“dir”;''''和'std :: cout <<“dir \ n”;'看起来不适合这个) – medivh

+0

等等,不,这只是''的'system()'命令,忘了我问了。 – medivh

1

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

myprog "arg1 | arg2" 

但在这种情况下,没有流