2012-12-10 53 views
0

我試圖將File1.txt ">" File2.txt作爲終端參數傳遞給我的程序,以覆蓋cat命令。但由於某種原因,該程序無法正常工作。雖然argc在上面定義的情況下是4,但程序中的條件仍然不成立。這裏是代碼:CommandLine參數不工作C

int main(int argc, char *argv[]) 
{ 
int readbytes,fp; 
char buf[1024]; 

if(argc==2) 
{ 
    fp=open(argv[1],O_RDONLY); 
    dup2(0,fp); 
    close(fp); 
    readbytes=read(STDIN_FILENO,buf,1024); 
    write(STDOUT_FILENO,buf,readbytes); 
} 

if(argc==4) 
{ 
    printf("inside4"); 
    fp=open(argv[1],O_RDONLY); 

    dup2(fp,0); 

    close(fp); 

    fp=open(argv[3],O_WRONLY|O_CREAT|O_TRUNC,S_IRWXU); 

    dup2(fp,1); 

    close(fp); 

    readbytes=read(STDIN_FILENO,buf,1024); 

    //printf("%c",buf); 

    write(STDOUT_FILENO,buf,readbytes); 
} 
return 0; 
} 

我找不到解決這個問題,所以我現在把它給專家。這個問題的原因是什麼?

注:

出於某種原因,當我發送./prog FILE1.TXT> FILE2.TXT編程,選擇argc==2條件,但是ARGC爲4。這是爲什麼?

Regards

+2

首先使用'\>'轉義'>'。第二次在'main()'中打印'argv'。 – trojanfoe

+0

'./prog File1.txt> File2.txt'不同於'./prog File1.txt「>」File2.txt'。 – alk

回答

5

這可能是由您如何運行程序引起的。打字

./myProg foo > bar 

將指示最炮彈運行myProg與參數foo和保存無論是打印到stdout在名爲bar文件。通過foo>bar作爲命令行參數,使用

./myProg foo \> bar 

./myProg 'foo' '>' 'bar' 

邊注:由於管道輸出到使用>一個文件是外殼,而不是一個程序等的一部分cat本身,你可能不應該擔心它。只需寫信給stdout,殼將處理剩下的部分。

+1

通常,允許指定輸出路徑的命令行應用程序根本不直接使用>操作符;相反,他們提供了一個'--output = '類型的參數。 – mah

+0

@ slavik262請查看我更新的問題.. – Alfred

+0

@Alfred'argc'對於'./prog File1.txt> File2.txt'是2。第一個參數是你用來啓動程序的路徑('。/ prog'),第二個參數是'File1.txt'。 –

1

你是什麼意思the condition in the program is not getting true?你是說你沒有看到在終端上打印的「inside4」?有幾件事情需要考慮。首先,你不檢查錯誤。我們將不得不假設您的所有opendup2調用都成功。我期望「inside4」被打印到輸出文件的末尾。原因很簡單,printf實際上沒有寫任何東西。它只是將字符串「inside4」存儲在一個緩衝區中,但該緩衝區不會寫入輸出,直到您的程序退出,並且此時基礎文件描述符已被更改爲輸出文件。最簡單的解決方法是在輸出中添加一個換行符,然後寫入printf("inside4\n");在正常設置中,打印換行符會導致內部緩衝區被刷新。您也可以在致電printf後致電fflush,明確清空緩衝區。