2011-12-02 80 views
2

我有這個C程序從用戶獲取輸入並將其發送到一個方法:如何在C中使用UNIX終端輸入重定向?

#include <stdio.h> 
#include <string.h> 
#include "constants.h" 
#include "lines.h" 
#include "compare.h" 

//gets arguments and sends to compare.c 
int main() { 
    int op = 1; 
    char filename[20]; 

    scanf("%d ", &op); 
    gets(filename); 
    if ((char) op + '0' < 49 || (char) op + '0' > 57) { 
     printf("Error: Invalid input"); 
     exit(0); 
    } 
    readstdin(filename, op); 
    return 0; 
} 

而不是執行該程序並從stdin讀取但是,我希望它從UNIX終端讀取,使得:

./sort [field] < input_file 

將讀入文件。 (如果沒有輸入,[字段]是選項,默認值爲1)。

例如執行在UNIX的C程序應該是這樣的命令:

./sort 1 < test.txt 

我如何去這樣做呢?

任何幫助都非常熟悉 謝謝!

+0

你想單獨傳遞文件名還是從命令行傳遞完整數據? –

+0

文件名和字段從命令行,但我想文件名和字段作爲單獨的值 –

+0

然後只需使用命令行參數。在main()中使用argc&argv –

回答

4

首先,您在代碼中以錯誤的方式獲取參數。如果你想要的是運行你的程序,如./sort <option> <filename>,那麼你不用stdin來檢索這些參數。

在C程序的參數被傳遞到主使用下面的函數簽名:

int main(int argc, char *argv[]) 

argc是傳遞給程序命令行參數的個數,和argv是這些參數的字符串數組。

隨着./sort 5 test.in運行:

  • argc將等於3
  • argv[0]"./sort"
  • argv[1]"5"
  • argv[2]"test.in"

您應該檢查的argc值爲3,以確保兩個參數都已經過去了("5""test.in"),以及文件名("./sort")共3


如果你想擁有可選字段,最好是在強制性字段之後,或者更好的方法是使用類似getopt的字樣,而不是像./sort --file test.in./sort --opt 5 --file test.in。這種情況可能沒有必要,但它是一種選擇。


您可以分析使用atoistrtol整數選項,但是你喜歡,把它從一個字符串(char*)轉換爲整型和fopenfgetsfclose從輸入文件中讀取。

+0

非常感謝你這是完美的 –