2017-11-22 7 views
2

どう違うのか分かりませんLinuxでC言語の入力ファイルを実行する

a。 ./target <input
b。 ./target <$(cat input)
c。

./target./target $(<input)は、Cプログラムであり、入力は、私がどのように異なっており、それ以上の技術や方法があることを知りたいファイルまたはペイロード

のですか?

+0

私は個人的に 'cat input | 。/ target'。 –

+3

あなたは[UUoC - 'cat'の無駄な使用](https://stackoverflow.com/questions/11710552/useless-use-of-cat)に気を遣い、@SamPagenkopf: –

答えて

2

3つの表記のうち2つはBash特有のものです。 3つはシェル表記です。実行されるプログラムは、全く異なる方法でデータを処理する必要があります。

  1. ./target <inputからinput redirection):ターゲットプログラムが情報を取得するために、標準入力を読み取る必要があります。

    #include <stdio.h> 
    
    int main(void) 
    { 
        int c; 
        while ((c = getchar()) != EOF) 
         putchar(c); 
        return 0; 
    } 
    
  2. ./target <$(cat input) - process substitution):ターゲットプログラムは、情報を取得するには、コマンドライン引数で指定したファイル名をオープンする必要があります。

    #include <stdio.h> 
    
    int main(int argc, char **argv) 
    { 
        if (argc != 2) 
        { 
         fprintf(stderr, "Usage: %s file\n", argv[0]); 
         return 1; 
        } 
        FILE *fp = fopen(argv[1], "r"); 
        if (fp == 0) 
        { 
         fprintf(stderr, "%s: failed to open file '%s' for reading\n", 
           argv[0], argv[1]); 
         return 1; 
        } 
    
        int c; 
        while ((c = getc(fp)) != EOF) 
         putchar(c); 
    
        fclose(fp); 
        return 0; 
    } 
    
  3. ./target $(<input)からcommand substitution):ターゲットプログラムは、プログラムへの引数、引数ごとに一つの単語として単語にファイル分割の内容を取得します。

    #include <stdio.h> 
    
    int main(int argc, char **argv) 
    { 
        int count = 0; 
        for (int i = 0; i < argc; i++) 
        { 
         count += printf(" %s", argv[i]); 
         if (count > 70) 
          putchar('\n'), count = 0; 
        } 
        return 0; 
    } 
    

必要な処理は、したがって、かなり異なっています。