私は最初にUnixパイプラインからデータを受け取り、ユーザに入力を促すアプリケーションを書いています。私が理解できないように見えるのは、パイプラインからの入力がユーザに入力を促す前に適切に閉じるように見えない理由です。私はここで非常に初歩的な何かを逃しているように感じる。C - stdin、unix pipeline、EOF
私は、標準入力をフラッシュするためのすべての例を試しましたが、hereは成功しませんでした。 Thisも潜在的に関連しているようですが、関連する回答を抽出することはできませんでした。
#include <stdio.h>
#include <stdlib.h>
#define BUFSZ 1024
int main(void) {
char *buf = calloc(BUFSZ, sizeof(char));
while(fgets(buf, BUFSZ, stdin)) { printf("Pipe input: %s", buf); }
printf("Enter input: ");
fgets(buf, BUFSZ, stdin);
printf("User input: %s", buf);
free(buf);
return 0;
}
使用例と出力:
$ cat testdata2 | ./a.out
Pipe input: testdata testdata
Pipe input: testdata testdata2
Pipe input: testdata testdata3
Pipe input: testdata testdata4
Pipe input: testdata testdata5
Pipe input: testdata testdata6
Pipe input: testdata testdata7
Enter input: User input: testdata testdata7
$
どのようにそれは(キーボード入力するためのもの)は、第2の関数fgets()は、バッファに触れることがないことをすることができますか?
このMCVEは、OSXとLinuxで同じ結果を得てコンパイルされています。
のように、
stdin
をパイプ処理されても別にターミナルを開く必要があり、キーボード入力を取得できべき 'のcalloc()' BUFSZ + 1ので、あなたは '\ 0 'のためのスペースを持っていますならばそのバッファーを満たすのに十分な長さの行を読み込みます。 –'stdin'は閉じられません(' fgets'が 'NULL'を返すので)、むしろユーザー入力のために再オープンされません。 – Kninnug
@ChrisTurner 'fgets'はそれを可能にします:実際のバッファサイズを伝えるだけです。 –