2013-09-22 41 views
0

我試圖在終端中使用「echo FileName.txt | a.c」,並將數據從文件讀取到我得到的頭文件中的數組中,但我迄今爲止的代碼只是給出我是一個無限循環。我嘗試將信息存儲在本地數組中,但結果仍然相同。使用echo讀取文件名並使用文件

main(int argc, char *argv[]) { 
    extern char test[]; 
    FILE *fp; 
    int i = 0; 
    int c;  // was char c; originally 
    if (argc == 1) { 
     fp = stdin; 
    } else { 
     fp = fopen (argv[1], "r"); 
    } 
    while ((c = getc(fp)) != EOF) { 
     test[i] = c; 
     printf("%c", test[i]); 
     i++; 
    } 
} 
+0

請注意,'a.c'通常是程序的C源代碼,而不是從C源創建的可執行文件。你可能應該用一個更具描述性的名字把'test'變成一個本地數組:'char filename [256];'。你應該確保你不會溢出數組(這意味着你必須知道它有多大)。你應該null終止字符串。當你遇到換行符時(或者如果你首先遇到EOF,你可能想停止閱讀)。你應該在使用指針之前檢查'fopen()'是否工作;用戶在混淆文件名時出了名。 –

+0

@JonathanLeffler:他使用'test'來存儲文件的內容,而不是文件名。看到我的答案。 –

回答

2

(1)將變量c更改爲int,以便識別EOF。 (2)不要在printf之前遞增i,否則會打印垃圾。

不知道你在用echo方法來完成什麼。

+0

他正在使用管道發送文件名到程序 – smac89

+0

我知道但他只打印文件名。 – Duck

+0

謝謝我改變了這一切,是的,我試圖做Smac69說什麼。我必須使用echo發送文件名,然後在程序中使用它,但我不完全確定如何... –

0

注意:我假設你的程序打算做你的問題中的代碼實際上做什麼,即從命令行參數命名的文件讀取輸入,或者如果沒有命令行參數是stdin給出。這是程序運行的常用方式,特別是在類Unix系統上。您的問題以及您調用該程序的方式表明您正在做的事情完全不同,即從標準輸入讀取文件名。這是一件不尋常的事情。如果這真的是你的意圖,請更新你的問題,以澄清你正在嘗試做什麼。

給出這個假設,問題不在你的程序中,而在於你如何調用它。這:

echo FileName.txt | a.c 

將餵養字符串FileName.txt作爲您的程序的輸入;該程序不知道(和應該不知道),它是一個文件名。

傳遞一個文件名到程序的方法是:

a.c FileName.txt 

或者,如果你想從stdin讀取該文件的內容:

a.c < FileName.txt 

(在後一種情況下, ,外殼將照顧爲你打開文件。)

可能從讀取文件名0,但這很少是正確的。

其他一些點(一些已經在評論中指出):

可執行文件可能不應該有.c結尾的名稱;後綴.c表示C源文件。

您應該用明確的返回類型聲明main;爲C99,有「隱int」的規則被刪除,這是從來沒有一個特別好的主意反正:

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

您正在閱讀的輸入文件的全部內容複製到您的test陣列。這很少需要;特別是,如果您只是將輸入文件複製到stdout,則不需要每次存儲多個一個字符的商店。如果您確實需要將文件的內容存儲在數組中,則需要擔心不會溢出數組。如果i超出數組的大小,您可能想要中止程序並顯示錯誤消息。

另請參閱Jonathan Leffler的評論中的其他建議;這都是很好的建議(除了我認爲他誤解了你的test數組的目的,你用它來存儲文件的內容,而不是它的名字)。