2015-07-13 27 views
-2

運行已編譯的C程序與a.out file_name_herea.out < file_name_here有什麼區別?如何在Linux上將文件讀入C程序?

我記得有關Linux管道的一些事情,但我不記得如何使a.out文件接受使用<符號的文件。

基本上,我問的是:如何在C代碼尋找一個C程序:

  1. file_name_here是一個文本文件的「hello world」爲內容
  2. 終端得到「一個。出< file_name_here」在命令行
  3. 終端顯示輸出: 「世界你好」
+2

'a.out file_name'將file_name作爲參數傳遞給程序,但'a.out

+0

@IskarJarak:'<'重定向而不是管道文件的內容。程序直接從文件中讀取;它沒有一個管道讀取。 –

回答

4

a.out file_name_here通 「file_name_here」 作爲參數。

a.out < file_name_here由shell處理,並將「file_name_here」的內容呈現給其「stdin」上的程序。

0

剛剛意識到我遇到的問題。 <符號表示外殼用C文件的內容替換C中的普通用戶輸入,因此所有正常調用(如fgetssscanf)都可以對其進行操作。

1

請注意,當您鍵入a.out < filename時,shell將處理I/O重定向。該程序使用來自指定文件而不是終端的標準輸入運行。當你輸入a.out filename時,程序必須處理打開文件,讀取文件(最好也關閉文件)。這些例子都不使用管道。你可以編寫cat file1 file2 file3 | a.out這將使用一個管道,並提供三個文件的內容作爲程序的標準輸入。

Unix系統上的很多程序都是過濾器。如果他們被給予文件名來處理,那些被讀取。如果他們沒有給出文件名,那麼他們會讀取標準輸入。這種程序的一個例子是grep;其他示例包括catsort

的一般的解決方案,在輪廓是:

extern void process_file(FILE *fp); // Where the real work is done 

int main(int argc, char **argv) 
{ 
    int rc = EXIT_SUCCESS; 
    if (argc == 1) 
     process_file(stdin); 
    else 
    { 
     for (int i = 1; i < argc; i++) 
     { 
      FILE *fp = fopen(argv[i], "r"); 
      if (fp == 0) 
      { 
       fprintf(stderr, "%s: failed to open file %s for reading\n", 
         argv[0], argv[i]); 
       rc = EXIT_FAILURE; 
      } 
      else 
      { 
       process_file(fp); 
       fclose(fp); 
      } 
     } 
    } 
    return rc; 
} 

這將處理任何命令行參數作爲要被讀取的文件,訴諸如果沒有文件被在命令行上指定讀取標準輸入。你可以在這個大綱中做一些額外的調整。您可以使用getopt()(或如果您使用GNU時爲getopt_long())輕鬆添加選項處理,並且您可以根據需要將文件名-作爲標準輸入。如果您認爲合適(例如有時不適用 - 例如,grep不適用),則可以在未能打開文件時退出。您可以將文件名傳遞給process_file()函數。您可以讓process_file()函數報告成功失敗,並且跟蹤是否所有操作都成功,只有在所有操作都成功時才退出。

相關問題