2010-12-13 5 views
1

ファイルまたはシェルの入力(パイプライン処理用)で動作するプログラムを記述する必要があります。これに対処する最も効率的な方法は何ですか?私は本質的に入力行を行単位で読む必要がありますが、入力はシェルやファイルからの別のプログラムの出力かもしれません。パイプライン入力データ

ありがとうございました

答えて

0

私はその名前付きパイプを使いたいと思います。しかし、私が知っていることから、他のプログラムはその出力を名前付きパイプに書き込む必要があります(そのプログラムにアクセスできる場合、それを実行できます)。そして、プログラムは名前付きパイプから読み込みます。

希望すると、これが役に立ちます。

0

私は質問を誤解されるかもしれないが、私はあなたのプログラムがこのように使用することができるようにしたいと思う:cat [some_file] | [your_program]または[your program] < [some_file]
標準入力(stdin/cin)から読み込むだけの場合は、シェルが残りの部分を処理します。

あなたが標準入力からか、コマンドラインutilsの数が何を行うことができ、ファイルから読み込むのいずれかにあなたのプログラムをしたい場合、すなわちcat

猫[OPTION] [FILE] ...
...
FILEがない場合、またはFILEが - の場合は、 標準入力を読み取ります。

上記のコードサンプルは、thisの記事を参照してください。

+0

ええ、あなたが言っていることは、私が探しているものだと思います。あなたが言っているのは、getline(std :: cin、mystring)のようなものを使うべきですか? – Bob

+0

シェルに直接使用すると言った内容を拡張することは可能でしょうか?たとえば、プログラムがシェルから行ごとに読み込まれるようにしたい場合... – Bob

+0

上記の例では、シェルはパイプを作成し、プログラム間のバイトを転送することで簡単に命を落とします。あなたのコードでやりたいのであれば、私が言及したように名前付きパイプを使用するか、シェルコマンドを実行するために "system()"関数をチェックする必要があります。 – Arunmu

1

コメントリンクが見つかりませんので、回答を投稿してください。 Eugen Constantin Dincaが言っているように、パイプやリダイレクトは単に標準入力に出力するので、あなたのプログラムは標準入力から読み込む必要があります。

私が言ったように、「行単位で読む」という意味は、ftpのインタラクティブモードのようなものですか?その場合は、プログラムに1回の行を読み込み、次の入力を待ってから、ターミナル信号を与えるまでループする必要があります。


編集:

int c; 
while(-1 != (c = getchar())) 
    putchar(c); 
+0

by read by line私はwhile(!EOF)やシェルに対応する文字のようなものを意味します。終了キャラクタが見つからないときに行を読み込み(例えば\ nで区切って)処理します – Bob

+0

はい、EOFは、ファイルからリダイレクトするかパイプを使用すると、stdinの終了を示します。 – user435657

1

はここEcho All Palindromes, in CからCの例です:

int main(int argc, char* argv[]) { 
    int exit_code = NO_MATCH; 
    if (argc == 1) // no input file; read stdin 
    exit_code = palindromes(stdin); 
    else { 
    // process each input file 
    FILE *fp = NULL; 
    int ret = 0; 
    int i; 
    for (i = 1; i < argc; i++) { 
     if (strcmp(argv[i], "-") == 0) 
     ret = palindromes(stdin); 
     else if ((fp = fopen(argv[i], "r")) != NULL) { 
     ret = palindromes(fp); 
     fclose(fp); 
     } else { 
     fprintf(stderr, "%s: %s: could not open: %s\n", 
       argv[0], argv[i], strerror(errno)); 
     exit_code = ERROR; 
     } 
     if (ret == ERROR) { 
     fprintf(stderr, "%s: %s: error: %s\n", 
       argv[0], argv[i], strerror(errno)); 
     exit_code = ERROR; 
     } else if (ret == MATCH && exit_code != ERROR) 
     // return MATCH if at least one line is a MATCH, propogate error 
     exit_code = MATCH; 
    } 
    } 
    return exit_code; 
} 

C++に適合させるには:std::istream&を受け入れる機能を(それが上記palindromesで)書きます。 std::cin(標準入力の場合は ' - 'ファイル名)、またはmain()関数の場合はifstreamオブジェクトのいずれかを渡します。

std::getline()と指定された行の行を1行ずつ読み込む関数を指定してstd::istreamオブジェクトを使用します(入力はファイルか標準入力かどうかは関係ありません)。

関連する問題