2016-09-25 51 views
0

我想在我的C程序中不輸入輸入文件的名稱。當我對文件名進行硬編碼時,所有其他組件都能正常工作。但希望能夠傳遞一個字符串文件名。 我正在嘗試編譯一個名爲Matrix.c的文件並將其可執行文件命名爲matrix如何在執行C程序時傳遞文件名

因此,在終端中,當我到達我的工作目錄。

gcc -g Matrix.c -o matrix 

然後當我編譯

./matrix 

它沒有傳遞給它一個文件名,所以我對於要去檢查,並讓用戶輸入一個文件名來加載。

然而,當有人通過文件名,是否應該通過爲:

./matrix filename.txt 

./matrix < filename.txt 

對於後者的選擇,我似乎無法得到參數的名稱從argv[1]傳遞給函數 - 它只是「(空)」。

我知道這是非常簡單的問題。但是我完全擺脫了搖桿嗎?這與我在OS X El Capitan上運行有什麼關係。我知道我以前使用'<'的慣例。

+0

我環顧四周,有很多不同的解決方案和不同的方法來處理它。 – WallofKron

+0

你能向我們展示'matrix.c'的代碼嗎?使用'<'重定向不需要任何額外的參數,但是您使用'scanf','gets'讀取'stdin',無論您是否使用標準輸入。 –

+0

當您使用<您將輸入從您的文件名重定向到您的程序。 –

回答

0

命令的參數在argv [1 .. argc-1]中。

'<'的重定向將文件的內容發送到程序的stdin。

獲取文件名的第三種方法是打印「輸入文件名:」,然後讀取用戶鍵入的字符串。

+0

謝謝你清理那個。我只是修正了它,並試圖解決所有三種輸入模式。謝謝 – WallofKron

4

問題主要在於shell如何工作。當你使用:

./matrix filename.txt 

然後該程序給出兩個參數 - 程序名和文件名。當您使用:

./matrix < filename.txt 

然後該程序只給定一個參數 - 程序名 - 與外殼安排它的標準輸入來自文件(文件名不傳遞給你的程序)。

可以使其工作;你只需要決定你想要支持。如果用戶輸入./matrix file1.txt file2.txt file3.txt,會發生什麼?傳統行爲的一個版本是依次處理每個文件,將每組結果寫入標準輸出。有很多其他行爲 - 其中大多數在某個時間或某個時候被某人使用。當沒有指定文件名稱時從標準輸入讀取是一種常見的操作模式(請考慮catgrep和...)。

+0

感謝您解決這個問題。我只是修正了它,並試圖解決所有三種輸入模式。謝謝 – WallofKron

+0

我經常使用類似'int處理器(FILE * fp,const char * fn)'的函數來讀取來自流'fp'的輸入,它是打開的文件'fn'(或者是'標準輸入的僞名' '),有時使用額外的參數'FILE * ofp'來指定輸出應該寫入哪個文件。 「成功」返回值爲0,其他任何失敗。然後,主程序中的代碼可以很容易地調用'processor()'。事實上,我有一組處理零個或多個剩餘參數的函數,所以'main()'結束'返回過濾器(argc,argv,optind,processor);'。 –

+0

'isatty()'在這裏很有用,參見http://stackoverflow.com/questions/1312922/detect-if-stdin-is-a-terminal-or-pipe-in​​-c-c-qt – cdarke

相關問題