2012-10-10 44 views
2

在Unix命令行,我需要使用輸入重定向到指定輸入文件:閱讀整數用C

./a.out < filename

下面是我的源代碼:

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

      char fileName[30]; 

      fgets(fileName, sizeof fileName, stdin); 

      printf("%s\n", fileName); 
    } 

該程序打印一個整數而不是文件名。如果我使用scanf("%s", fileName);

我得到了相同的結果我的谷歌福已經失敗了我。我究竟做錯了什麼?

編輯:需要使用輸入重定向(具體爲<),所以命令行參數不是一個選項。但是,我不需要真正知道文件名,我只需要從文件中讀取換行符分隔的整數。看來我正在問錯誤的問題。

+2

也許「文件名」恰巧從只有一個數字的行開始? – wildplasser

+0

您是否正在嘗試使用stdin讀取名爲'filename'的文件的內容或(2)嘗試讀取文件的名稱,然後打開()並使用文件I/O讀取該文件的名稱? –

+0

@nos這是我的一個誤解。我認爲'<'會讀取命令行的其餘部分作爲標準輸入,此時我將不得不打開文件並從中讀取文件。但是,'<'運算符打開文件並將其內容視爲輸入到stdin中。我過分複雜化了這個問題。 –

回答

4

我只需要從文件中讀取換行符分隔的整數。看來我正在問錯誤的問題。

shell的輸入重定向操作符<將指定的文件與程序的標準輸入相關聯。您的程序不需要採取任何特殊行動來打開文件 - 它已經打開。因爲如果用戶是在鍵盤上打字剛剛從輸入讀取:

/* foo.c */ 
#include <stdio.h> 
int main(int ac, char **av) { 
    int i; 
    while(scanf("%d", &i) == 1) { 
    printf("Got one!: %d\n", i); 
    } 
    return 0; 
} 

編譯程序:

cc foo.c 

就這樣運行:

a.out < filename 
+0

這是完美的。非常感謝你。 –

1

看起來你正試圖通過stdin將一些文件名傳遞給你的程序。在這種情況下,filename應該是一個文件,而不是一個字符串。您需要的僅僅是將您需要的文件名作爲命令參數(./a.out filename)傳遞並從您的程序中從argv中提取出來。

3

從重定向流獲取文件名沒有(簡單)方式,因爲您的應用程序看到的都是打開的文件描述符。有一種「硬」的方式僅適用於Linux:readlink("/proc/self/fd/0")

如果您必須知道文件名,請將其作爲常規參數傳遞(./a.out filename)並查看argv[1]而不是使用輸入重定向。

但是,由於您只是想讀取文件(而且您不關心文件名),因此您只需從stdin中讀取,就像您已經在做的那樣。