2013-05-20 83 views
0

我有以下的C++程序:窗口管道連接到C++程序

#include <iostream> 
using namespace std; 

//will find the last dot and return it's location 
char * suffix_location(char *); 

int main(int argc, char* argv[]) 
{ 
    if (argc < 2) 
    { 
     cout << "not enough arguments!" << endl; 
     for (int i = 0; i < argc; i++) 
      cout << argv[i] <<endl; 
     exit(1); 
    } 
    //ignore first parameter (program name). 
    argv ++; 
    argc --; 

    //the new suffix 
    char * new_suffix = argv[0]; 

    argv++; 
    argc--; 

    for (int i = 0; i < argc; i++) 
    { 
     char * a = suffix_location(argv[i]); 
     if (a != NULL) 
     { 
      a[0] = NULL; 
      cout << argv[i] << '.' << new_suffix << endl; 
     } 
    } 
    return 0; 
} 

char * suffix_location(char * file_name) 
{ 
    char * ret = NULL; 
    for (; * file_name; file_name++) 
     if (*file_name == '.') 
      ret = file_name; 
    return ret; 
} 

我使用以下命令將其編譯:

cl /EHsc switch_suffix.cpp 

當我運行

switch_suffix py a.exe b.txt 

我得到:

a.py 
b.py 

與預期的一樣。
當我嘗試管道時,該問題就會出現。運行以下:

dir /B | swich_suffix py 

結果一無所獲,運行

dir /B | swich_suffix py 

結果:

not enough arguments! 
switch_suffix 

系統上的管路工作正常 - 我試圖在一些其他程序。
我試着創建一個vs項目並從那裏編譯代碼 - 什麼也沒有幫助。

最新錯了,鋤頭可以修復嗎?

我使用vs2010工具在win7上運行。

回答

0

當你管到另一個程序不言而喻的標準輸入,而不是在主要參數。

這段代碼打印出它所接收的stdinstdout,試試這個:

for (std::string line; std::getline(std::cin, line);) { 
     std::cout << line << std::endl; 
} 
+0

我'cin.getline'試圖將數據retrive成'的char *'。它沒有工作。兩者之間有真正的區別嗎? – elyashiv

+0

是的,std :: string是用於在C++中存儲字符串的對象。內存是爲您管理的,並且內置了很多不錯的方法。 'char *'是指向一些你必須自己管理的字符的指針。我強烈要求你用C++編寫時使用std :: string。如果你決定使用'char *',那麼看看http://stackoverflow.com/questions/4023895/how-to-read-string-entered-by-user-in-c – Steve

3

當你管,這被傳遞給你的程序的信息是標準輸入,而非argv